如何高效在Delphi中连续创建大型位图而不必每次都清除?

2026-04-10 16:291阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计386个文字,预计阅读时间需要2分钟。

如何高效在Delphi中连续创建大型位图而不必每次都清除?

使用TBitmap封装器从单像素Graphics中提取GDI位图时,我注意到在使用SetSize(w, h)设置位图大小时,它通常会清除位图(通过PatBlt调用)。当我稍后复制这些位图时,似乎ScanLine是最快的选择。

当使用TBitmap包装器从单元Graphics中获取GDI位图时,我注意到在使用SetSize(w,h)设置位图时,它总是会清除位图(使用PatBlt调用).当我稍后复制这些位时(参见下面的例程),似乎ScanLine是最快的可能性,而不是SetDIBits.

如何高效在Delphi中连续创建大型位图而不必每次都清除?

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没有初始化像素本身并使像素的内存未初始化(例如脏)?还是有另一种方法来做这样的事情.我知道我们可以处理像素,但这仍然留下了150毫秒的像素初始化.

你在这里做的事情并不多 – 使用巨大的位图很慢……但是你可以尝试以下方法:

>在调用SetSize()之后设置PixelFormat – 这不会避免像素的初始化,但可能会使它更快.
>我能想到的最快方法是使用Win32 API函数(this或this)创建DIB,并将该DIB的HBITMAP句柄分配给TBitmap对象的句柄.>使用内存映射文件(再次需要调用API,或者有一些第三方库可以为您执行此操作).

本文共计386个文字,预计阅读时间需要2分钟。

如何高效在Delphi中连续创建大型位图而不必每次都清除?

使用TBitmap封装器从单像素Graphics中提取GDI位图时,我注意到在使用SetSize(w, h)设置位图大小时,它通常会清除位图(通过PatBlt调用)。当我稍后复制这些位图时,似乎ScanLine是最快的选择。

当使用TBitmap包装器从单元Graphics中获取GDI位图时,我注意到在使用SetSize(w,h)设置位图时,它总是会清除位图(使用PatBlt调用).当我稍后复制这些位时(参见下面的例程),似乎ScanLine是最快的可能性,而不是SetDIBits.

如何高效在Delphi中连续创建大型位图而不必每次都清除?

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没有初始化像素本身并使像素的内存未初始化(例如脏)?还是有另一种方法来做这样的事情.我知道我们可以处理像素,但这仍然留下了150毫秒的像素初始化.

你在这里做的事情并不多 – 使用巨大的位图很慢……但是你可以尝试以下方法:

>在调用SetSize()之后设置PixelFormat – 这不会避免像素的初始化,但可能会使它更快.
>我能想到的最快方法是使用Win32 API函数(this或this)创建DIB,并将该DIB的HBITMAP句柄分配给TBitmap对象的句柄.>使用内存映射文件(再次需要调用API,或者有一些第三方库可以为您执行此操作).