【问题标题】:Fastest way to draw 40 bitmap on Form canvas Delphi在表单画布 Delphi 上绘制 40 位图的最快方法
【发布时间】:2013-06-26 16:00:54
【问题描述】:

我有一个包含 3 个成员(位图路径、x、y)的记录数组。

我必须通过 x , y 在 Form canvas 上的记录绘制位图中加载值。

我用这段代码试过了:

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 张图像。

  • 是否应该将 bitmpas 存储在内存中以供重复使用?
  • 我应该使用指针来绘制图像吗?
  • 或者我应该使用线程来实现最快的绘制?

请告诉我样品谢谢。

【问题讨论】:

  • 在画布上绘制单个像素效率低下。这大概是因为画布将为您绘制的每个像素刷新。复制整个图像后,您只想刷新。看看这个:programmersheaven.com/mb/Delphi/110783/110783/tcanvas,建议您使用 ScanLine 程序。
  • @AudioGL,嗯,是的,不是真的。除了原子操作效率低下(与批量操作相反)之外,它还使用了 WinGDI 的 GetPixel/SetPixel,它们本身就很慢。
  • 可能有更好的方法来执行此操作,具体取决于位图的性质,例如它们是否都相同大小,是否需要从文件加载还是从资源加载,以及如何通常需要这样做。

标签: delphi bitmap drawing


【解决方案1】:

使用 Draw 方法:

BuffBitmap.LoadFromFile(All[i].Addrs);
Self.Canvas.Draw(All[i].X, All[i].Y, BuffBitmap);

【讨论】:

  • 谢谢,我选择通用方式,如果我想画一个位图的一部分,我不能用这种方式。
  • @MahdiParsa,Uwe 提出了最有效的方法。如果您想做位图的一部分(原始问题中未指明),您可以首先使用描述的功能裁剪位图,例如:stackoverflow.com/questions/9183524/…
  • 还有 Canvas.CopyRect 你可以使用 BuffBitmap.Canvas 作为源。您必须确定矩形,这甚至可以让您进行缩放。
猜你喜欢
  • 2011-10-14
  • 2011-11-29
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多