一个关于图片的问题:
我要实现的功能如下:
窗体上先添加一幅背景图片,然后再使用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次时。请问有没有人遇到这种问题呀?为什么开始运行的时候图片可以正确显示,而一段时间后就不行了呢?请知道的高手们赶快帮帮忙呀!!小弟谢谢了!
我要实现的功能如下:
窗体上先添加一幅背景图片,然后再使用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次时。请问有没有人遇到这种问题呀?为什么开始运行的时候图片可以正确显示,而一段时间后就不行了呢?请知道的高手们赶快帮帮忙呀!!小弟谢谢了!
下列代码原作者【饭桶×××】
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啦
不过,我要实现的只是一个小小的功能而已,你这个好像太复杂了点吧?呵呵……
我并不是显示不出图片,只是很奇怪,当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'……
请问还有其他解决方法吗??