7

我想用代码创建大位图

  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。

4

3 回答 3

6

像这样设置像素格式:

LargeBmp.PixelFormat := pf24Bit;

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

于 2012-10-25T08:03:01.467 回答
6

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

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

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

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

因此,除了 pf24bit 之外,请尝试其他一些方法,以找到最适合您的生产环境的方法。我使用 pf8bit 选项节省了相当多的内存。

于 2012-10-25T15:26:36.637 回答
5

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

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

现在,你问为什么它在win7中没有失败?好的,可能是因为没有 GDI,但是 GDI+ 和 Direct2D 在 win 7 中使用。也许其他驱动程序的版本,不知道。

于 2012-10-25T08:49:55.283 回答