Delphi上的大比特图



我想用代码创建大量位图

  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。

相关内容

  • 没有找到相关文章

最新更新