我想用代码
创建大型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。
答案 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中使用。也许其他司机的版本,不知道。