当使用TBitmap Package 器从单元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内存)。使用这些iomages,创建一个空位图需要150ms,覆盖它的内容需要140ms。
有没有一种方法可以初始化一个大小正确的TBitmap,而不初始化像素本身,并留下像素的内存未初始化(如脏)?或者有没有另一种方法来做这样的事情。我知道我们可以在适当的位置对像素进行工作,但这仍然留下了150ms的像素不必要的初始化。
3条答案
按热度按时间h4cxqtbf1#
在这里您可以做的事情不多-处理巨大的位图速度很慢...但您可以尝试以下操作:
1.在调用SetSize()后设置PixelFormat-这不会避免像素的初始化,但可能会使其更快。
1.我能想到的最快的方法是使用Win32 API函数(this或this)创建一个DIB,并将该DIB的HBITMAP句柄分配给TBitmap对象的句柄。
1.使用内存Map文件(同样需要调用API,或者有一些第三方库可以为您做到这一点)。
qmelpv7a2#
我知道这是很多年前发布的,但是它仍然是相关的,因为最近的 Delphi 版本以同样低效的方式运行。
我已经创建了一个基本但功能齐全的TBitmap替代方案,它非常轻便和高效。当然,它可以通过各种方式扩展以添加所需的功能,但它确实是工作和有用的。用 Delphi 10.4测试。