我的一个Gif转Bmp后,地图改色的例子!运行起来比较慢,一张572*572的图要几秒钟,有没有办法快一点? ( 积分: 30 )

  • 主题发起人 主题发起人 setking
  • 开始时间 开始时间
S

setking

Unregistered / Unconfirmed
GUEST, unregistred user!
function TForm1.RadarGifToBmp(strSource, strDest: string): Boolean;
var
I,j: Integer;
image1:Timage;
gif1:Tgifimage;
begin
try
image1:=timage.Create(owner);
gif1:=Tgifimage.Create;
gif1.LoadFromFile(ExtractFileDir(application.ExeName) + '/radar/' + strSource);
image1.Picture.Bitmap:=gif1.Bitmap;

for I := 2 to 574 do
begin
for j := 2 to 574 do
begin
if (image1.Canvas.Pixels[i,j]=rgb(149,108,66)) or (image1.Canvas.Pixels[i,j]=rgb(82,82,139)) or (image1.Canvas.Pixels[i,j]=rgb(212,155,95)) or (image1.Canvas.Pixels[i,j]=rgb(117,117,199)) then image1.Canvas.Pixels[i,j] := rgb(255,255,255);
end;
end;

image1.Canvas.CopyMode:=cmSrcCopy;
image1.Canvas.CopyRect(rect(0,0,572,572),image1.Canvas,rect(2,2,574,574));

image1.Picture.Bitmap.Width:=572;
image1.Picture.Bitmap.Height:=572;

image1.Picture.SaveToFile(ExtractFileDir(application.ExeName)+'/radartemp/'+strDest);

image1.free;
gif1.Free;
result:=True;
except
result:=False;
end;
end;
 
function TForm1.RadarGifToBmp(strSource, strDest: string): Boolean;
var
I,j: Integer;
image1:Timage;
gif1:Tgifimage;
begin
try
image1:=timage.Create(owner);
gif1:=Tgifimage.Create;
gif1.LoadFromFile(ExtractFileDir(application.ExeName) + '/radar/' + strSource);
image1.Picture.Bitmap:=gif1.Bitmap;

for I := 2 to 574 do
begin
for j := 2 to 574 do
begin
if (image1.Canvas.Pixels[i,j]=rgb(149,108,66)) or (image1.Canvas.Pixels[i,j]=rgb(82,82,139)) or (image1.Canvas.Pixels[i,j]=rgb(212,155,95)) or (image1.Canvas.Pixels[i,j]=rgb(117,117,199)) then image1.Canvas.Pixels[i,j] := rgb(255,255,255);
end;
end;

image1.Canvas.CopyMode:=cmSrcCopy;
image1.Canvas.CopyRect(rect(0,0,572,572),image1.Canvas,rect(2,2,574,574));

image1.Picture.Bitmap.Width:=572;
image1.Picture.Bitmap.Height:=572;

image1.Picture.SaveToFile(ExtractFileDir(application.ExeName)+'/radartemp/'+strDest);

image1.free;
gif1.Free;
result:=True;
except
result:=False;
end;
end;
 
用pixel[x, y]修改图片是最慢的. 哪怕把图片复制到一个临时bmp中再用scanline操作这个临时bmp和当前bmp也比用pixel快n倍(n一般>3)
 
看来是个气象部门的同行,我一般使用bmp的scanline作处理,而且处理时要注意算法,一般情况下就非常快!
 
后退
顶部