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.
设置像素格式如下:
LargeBmp.PixelFormat := pf24Bit;
Run Code Online (Sandbox Code Playgroud)
我曾多次遇到同样的问题并且总能解决它.
如前所述,如果不设置像素格式,Windows会将其视为依赖于设备的位图.设置像素格式时,可以创建DIB(与设备无关的位图).这意味着它独立于显示设备(图形卡).
我有同样的问题,并想指出pf24bit不是唯一的选择.在图形单元中,您还具有:
TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom);
Run Code Online (Sandbox Code Playgroud)
对于我正在研究的项目,我发现8位选项最适合我需要的,因为我有一个非常大的位图(高分辨率),但颜色有限(我从一些简单的代码创建整个位图) .
因此,尝试除了pf24bit之外的其他几个,以找到适合您的生产环境的最佳选择.我用pf8bit选项保存了相当多的内部存储器.
创建的位图(默认情况下)存储在某个缓冲区中.缓冲区的大小取决于视频驱动程序,操作系统和上帝知道还有什么.这个缓冲区可能非常小(大约20-25mb),如果你试图创建更多,它将失败.
要避免这种情况,请尝试创建DIB而不是TBitmap,或尝试更改Pixelformat为pf24bit.这将告诉系统在用户的内存中创建Bitmap而不是GDI缓冲区.
现在,为什么你在win7中没有失败?好吧,可能导致没有GDI,但GDI +和Direct2D在win 7中使用.也许其他司机的版本,不知道.