【发布时间】:2010-03-23 14:04:47
【问题描述】:
当使用 TBitmap 包装器从单元 Graphics 中获取 GDI 位图时,我注意到在使用 SetSize(w, h) 设置位图时,它总是会清除位图(使用 PatBlt 调用)。当我稍后复制位时(参见下面的例程),似乎 ScanLine 是最快的可能性,而不是 SetDIBits。
function ToBitmap: TBitmap;
var
i, N, x: Integer;
S, D: PAnsiChar;
begin
Result := TBitmap.Create();
Result.PixelFormat := pf32bit;
Result.SetSize( width, height );
S := Src;
D := Result.ScanLine[ 0 ];
x := Integer( Result.ScanLine[ 1 ] ) - Integer( D );
N := width * sizeof( longword );
for i := 0 to height - 1 do begin
Move( S^, D^, N );
Inc( S, N );
Inc( D, x );
end;
end;
我需要处理的位图非常大(150MB 的 RGB 内存)。使用这些图像需要 150 毫秒来简单地创建一个空位图,并需要 140 毫秒来覆盖它的内容。
有没有一种方法可以用正确的大小初始化一个 TBitmap,而不用初始化像素本身并使像素的内存未初始化(例如脏)?或者有没有另一种方法来做这样的事情。我知道我们可以在原地处理像素,但这仍然会留下 150 毫秒的不必要的像素初始化。
【问题讨论】:
标签: delphi optimization bitmap