一个关于图片的问题:
我要实现的功能如下:
窗体上先添加一幅背景图片,然后再使用Image组件以及Timer在窗体的一角显示一组动画!
我是这样做的:
先在窗体上加了一个背景图片,使用的是Oncreate   Formpaint   然后再使用Image,设置Timer在Image上面每一秒钟切换一幅图片。编译成功,但是运行了一段时间后,出现错误Bitmap image is not valid!出现错误的地方是Formpaint段的绘图代码:Picture.loadfilename('login.bmp')
Loginform.canvas.stretchdraw(rect(0,0,Loginform.width,Loginform.height),picture.graphic);
我测试过了,出现问题的时间是Timer运行了第157次时。请问有没有人遇到这种问题呀?为什么开始运行的时候图片可以正确显示,而一段时间后就不行了呢?请知道的高手们赶快帮帮忙呀!!小弟谢谢了!

解决方案 »

  1.   

    给一段类似的代码,自己看
    下列代码原作者【饭桶×××】
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        Image1: TImage;
        Label1: TLabel;
        Image2: TImage;
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        function SetLCDRGN(aRECT: TRECT): HRGN;
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      RGN: HRGN;
      PosX, PosY: Integer;
      BackroundBmp, ShowBmp: TBitMap;
    implementation{$R *.dfm}procedure DrawTransparent(var sBmp: TBitMap; dBmp: TBitMap; PosX, PosY: Integer; TranColor: TColor = -1);
    type
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..32767] of TRGBTriple;
      function GetSLColor(pRGB: TRGBTriple): TColor;
      begin
        Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
      end;
    var
      b, p: PRGBTripleArray;
      x, y: Integer;
      BaseColor: TColor;
    begin
      sBmp.PixelFormat := pf24Bit;
      dBmp.PixelFormat := pf24Bit;
      p := dBmp.scanline[0];  if TranColor = -1 then
        BaseCOlor := GetSLCOlor(p[0])
      else
        BaseCOlor := TranColor;  if (PosY > sBmp.Width) or (PosY > sBmp.Height) then
        Exit;  for y := 0 to dBmp.Height - 1 do
      begin
        p := dBmp.scanline[y];
        b := sBmp.ScanLine[y + PosY];
        for x := 0 to (dBmp.Width - 1) do
        begin
          if GetSLCOlor(p[x]) <> BaseCOlor then
            b[x + PosX] := p[x];
        end;
      end;end;
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      bmp: Tbitmap;
    begin
      SelectClipRgn(Image2.Canvas.Handle, RGN);
      PosX := PosX - 1; //移动像素
      if PosX < -Image1.Picture.Width then
        PosX := 600;  bmp := TBitmap.Create;
      bmp.Assign(BackroundBmp);
      DrawTransparent(bmp, ShowBmp, PosX, PosY); //合成图像
      Image2.Canvas.Draw(0, 0, bmp); //画出效果图
      bmp.Free;
    //  Canvas.Draw(PosX, PosY, Image1.Picture.Graphic);end;procedure TForm1.FormCreate(Sender: TObject);
    var
      s: string;
      r: TRect;
    begin
      BackroundBmp := TBitMap.Create;//背景图层
      BackroundBmp.Width := 600;
      BackroundBmp.Height := 200;
      BackroundBmp.Canvas.FillRect(rect(0, 0, BackroundBmp.Width, BackroundBmp.Height));
      BackroundBmp.Canvas.Draw(0, 0, Image1.Picture.Graphic);  ShowBmp := TBitMap.Create;//文字图层
      ShowBmp.Width := 600;
      ShowBmp.Height := 200;
      ShowBmp.Canvas.FillRect(rect(0, 0, ShowBmp.Width, ShowBmp.Height));
      ShowBmp.Canvas.Font.Name := '隶书';
      ShowBmp.Canvas.Font.Size := 60;
      ShowBmp.Canvas.Font.Color := clRed;
      s := '中华人民共和国';
      r := RECT(0, 0, ShowBmp.Width, ShowBmp.Height);
      drawtext(ShowBmp.Canvas.Handle, pchar(s), length(s), r,
        DT_CENTER or
        DT_SINGLELINE or
        DT_VCENTER);  //初始化LCD效果区域  
      RGN := SetLCDRGN(RECT(0, 0, BackroundBmp.Width, BackroundBmp.Height));
      PosX := BackroundBmp.Width;
      PosY := 0;
      Show;
    //  Update ;
    //  SelectClipRgn(Canvas.Handle, RGN);
    //  Canvas.FillRect(RECT(0, 0, BackroundBmp.Width, BackroundBmp.Height));end;function TForm1.SetLCDRGN(aRECT: TRECT): HRGN;
    var
      rTemp, r: HRGN;
      x, y: integer;
    begin
      Result := CreateRectRgn(0, 0, 0, 0);
      for y := aRECT.Top to aRECT.Bottom do
        if (y mod 4) = 0 then
          for x := aRECT.Left to aRECT.Right do
          begin
            if (x mod 4) = 0 then
            begin
              rTemp := CreateRectRgn(x, y, x + 3, y + 3);
              CombineRgn(Result, Result, rTemp, RGN_OR);
    //          CombineRgn(r, r, rTemp, RGN_XOR);
            end;
          end;
      DeleteObject(rTemp);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      BackroundBmp.Free;
      ShowBmp.Free;
    end;end.注意,本程序适合显示任何图像,只要设定好透明颜色就OK啦
      

  2.   

    不管怎么样,先谢谢楼上的!
    不过,我要实现的只是一个小小的功能而已,你这个好像太复杂了点吧?呵呵……
    我并不是显示不出图片,只是很奇怪,当Timer计数到第157次时就会出现错误!也就是当第157次切换动画组的图片时,却提示Form的背景图片无效!我的代码大致如下:
    Formcreate段:
    var
    picture:tpicture;
    begin
    picture:=tpicture.create;
    end;Formpaint段:
    var
    picture:tpicture;
    begin
    picture:=tpicture.create;
    picture.loadfromfilename(picture_name);
    form.canvas.stretctdraw(rect(0,0,form.width,form.height),picture.graphic);
    picture:=nil;
    end;//以上背景图片部分var
    num:integer=3;
    form.Timer1Timer;
    var
    xh:integer;
    curdir,picfile:string;
    begin
    xh:=num mod 3;//3张图片轮流切换
    getdir(0,curdir);
    picfile:=curdir+'\zs'+inttostr(xh+1)+'.bmp';//图片路径,三张图片分别zs1/2/3
    Image1.picture.loadfromfile(picfile);
    num:=num+1;//下一张图片
    if num:=1000 then  num:=3;//num太大时,重新计算。
    end;//以上部分用来轮流显示图片形成动态效果。程序运行成功,但是当num计算到161时(初值为3,也就是已执行了157次),弹出错误提示:
    …………Message with 'bitmap is not valid'……
    请问还有其他解决方法吗??