Delphi上的大位图

bar*_*ris 7 delphi graphics bitmap

我想用代码创建大型Bitmap

  LargeBmp := TBitmap.Create;
  try
    LargeBmp.Width := 1000; // fine 
    LargeBmp.Height := 15000; // XP - EOutOfResources, Not enough memory, Win 7 - works fine
    ...
  finally
    FreeAndNil(LargeBmp);
  end;
Run Code Online (Sandbox Code Playgroud)

此代码EOutOfResources在Windows XP上引发了"内存不足" 的异常,但在Windows 7中运行正常.

怎么了?为什么内存不足?它只有60 MB.

jpf*_*ius 6

设置像素格式如下:

LargeBmp.PixelFormat := pf24Bit;
Run Code Online (Sandbox Code Playgroud)

我曾多次遇到同样的问题并且总能解决它.

  • 正如Darthman所指出的,这将您的位图从有限的GDI内存重新定位到应用程序的用户内存,最高可达2 GB. (2认同)

Ben*_*n C 6

如前所述,如果不设置像素格式,Windows会将其视为依赖于设备的位图.设置像素格式时,可以创建DIB(与设备无关的位图).这意味着它独立于显示设备(图形卡).

我有同样的问题,并想指出pf24bit不是唯一的选择.在图形单元中,您还具有:

TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom);
Run Code Online (Sandbox Code Playgroud)

对于我正在研究的项目,我发现8位选项最适合我需要的,因为我有一个非常大的位图(高分辨率),但颜色有限(我从一些简单的代码创建整个位图) .

因此,尝试除了pf24bit之外的其他几个,以找到适合您的生产环境的最佳选择.我用pf8bit选项保存了相当多的内部存储器.


Dar*_*man 5

创建的位图(默认情况下)存储在某个缓冲区中.缓冲区的大小取决于视频驱动程序,操作系统和上帝知道还有什么.这个缓冲区可能非常小(大约20-25mb),如果你试图创建更多,它将失败.

要避免这种情况,请尝试创建DIB而不是TBitmap,或尝试更改Pixelformatpf24bit.这将告诉系统在用户的内存中创建Bitmap而不是GDI缓冲区.

现在,为什么你在win7中没有失败?好吧,可能导致没有GDI,但GDI +和Direct2D在win 7中使用.也许其他司机的版本,不知道.