【发布时间】: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,它们本身就很慢。
-
可能有更好的方法来执行此操作,具体取决于位图的性质,例如它们是否都相同大小,是否需要从文件加载还是从资源加载,以及如何通常需要这样做。