我想用代码创建大量位图
LargeBmp := TBitmap.Create;
try
LargeBmp.Width := 1000; // fine
LargeBmp.Height := 15000; // XP - EOutOfResources, Not enough memory, Win 7 - works fine
...
finally
FreeAndNil(LargeBmp);
end;
此代码在Windows XP上提出了带有消息"不够内存"的EOutOfResources
例外,但在Windows 7中工作正常。
怎么了?为什么没有足够的内存?只有60 mb。
以下设置像素格式:
LargeBmp.PixelFormat := pf24Bit;
我有几次相同的问题,并且总是解决了。
已经讨论过,如果您不设置像素格式,则将其视为与设备有关的位图。设置像素格式时,您会创建一个DIB(独立于设备的位图)。这意味着它独立于显示设备(图形卡)。
我遇到了同样的问题,并想指出PF24BIT并不是唯一的选择。在图形单元中,您也有:
TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom);
对于我正在从事的项目,我发现8位选项最适合我需要的东西,因为我的位图非常大(高分辨率),但是颜色有限(我正在从某些中创建整个位图简单代码)。
因此,除了PF24BIT以外,其他一些其他方法可以找到最佳的生产环境。我使用PF8BIT选项保存了很多内存。
创建的位图(默认情况下)存储在某些缓冲区中。缓冲区的大小取决于视频模具,OS和上帝知道还有什么。此缓冲区可能很小(约20-25mb),如果您尝试创建更多,它将失败。
为了避免这种情况,尝试创建DIB而不是TBITMAP,或尝试将Pixelformat
更改为pf24bit
。这将使系统在用户的内存中创建位图,而不是GDI缓冲区。
现在,为什么它不在Win7中失败?好的,可能导致没有GDI,但是GDI 和Direct2D在Win 7中使用。也许其他驾驶员的版本,dunno。