Delphi上的大位图

时间:2012-10-25 07:20:07

标签: 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;

此代码引发EOutOfResources异常消息"内存不足"在Windows XP上,但在Windows 7中可以正常工作。

有什么问题?为什么内存不足?它只有60 MB。

3 个答案:

答案 0 :(得分:6)

像这样设置像素格式:

LargeBmp.PixelFormat := pf24Bit;

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

答案 1 :(得分:6)

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

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

TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom);

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

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

答案 2 :(得分:5)

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

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

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