在窗体画布Delphi上绘制40位图的最快方法

在窗体画布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

我有一个包含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: 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,这是众所周知的速度较慢的方法。根据位图的性质,可能有更好的方法来实现这一点,例如位图大小是否相同,是否需要从文件加载还是从资源加载,以及需要多久做一次。