在窗体画布Delphi上绘制40位图的最快方法
我有一个包含3个成员的记录数组(位图路径,x,y) 我必须在加载完记录中的值后,通过x,y在窗体画布上绘制位图 我尝试使用以下代码:在窗体画布Delphi上绘制40位图的最快方法,delphi,bitmap,drawing,Delphi,Bitmap,Drawing,我有一个包含3个成员的记录数组(位图路径,x,y) 我必须在加载完记录中的值后,通过x,y在窗体画布上绘制位图 我尝试使用以下代码: const MAXX = 40 ; type ImgObj = record Addrs : string; X: Integer ; Y: Integer ; end; var All : array[1..MAXX] of ImgObj ; procedure TForm1.btn1Click(Sender: TObj
const
MAXX = 40 ;
type
ImgObj = record
Addrs : string;
X: Integer ;
Y: Integer ;
end;
var
All : array[1..MAXX] of ImgObj ;
procedure TForm1.btn1Click(Sender: TObject);
var
BuffBitmap :TBitmap ;
I,j,k: Integer;
begin
// set all bit maps
....
// draw 40 images
BuffBitmap := TBitmap.Create ;
for I := 1 to MAXX do
begin
BuffBitmap.LoadFromFile(All[i].Addrs);
for j := 0 to BuffBitmap.Width-1 do
for k := 0 to BuffBitmap.Height-1 do
begin
Self.Canvas.Pixels[All[i].X+j,All[i].Y+k] := BuffBitmap.Canvas.Pixels[j,k] ;
end;
end;
BuffBitmap.free;
end;
这段代码很好地绘制了它们,但耗时约8秒。
我必须在我的应用程序中更多地重复此事件
现在,我如何才能以最快的方式在画布上绘制40幅图像
- 我应该在内存中存储BitMPA以供重复吗李>
- 我应该使用用户指针来绘制图像吗
- 或者我应该使用线程来实现最快的绘制
BuffBitmap.LoadFromFile(All[i].Addrs);
Self.Canvas.Draw(All[i].X, All[i].Y, BuffBitmap);
谢谢,我选择了通用方法,如果我想画一个位图的一部分,我不能用这种方法。@MahdiParsa,Uwe提出了最有效的方法。如果您想做位图的一部分(原始问题中未指出),可以首先使用下面介绍的函数裁剪位图,例如:这里还有Canvas.CopyRect,您可以将BuffBitmap.Canvas用作源。你必须确定矩形,这甚至给了你缩放的能力。在画布上绘制单个像素是低效的。这大概是因为画布将为您绘制的每个像素刷新。您将只希望在复制完整个图像后刷新。看看这个:建议您使用扫描线程序的地方。@AudioGL,嗯,是的,不是真的。除了原子操作效率低下(与批处理操作相反)之外,它还使用WinGDI的GetPixel/SetPixel,这是众所周知的速度较慢的方法。根据位图的性质,可能有更好的方法来实现这一点,例如位图大小是否相同,是否需要从文件加载还是从资源加载,以及需要多久做一次。