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;

このコードは、EOutOfResourcesWindows XP では「メモリが不足しています」というメッセージで例外を発生させますが、Windows 7 では正常に動作します。

なにが問題ですか?なぜ十分なメモリがありませんか? わずか60MBです。

4

3 に答える 3

6

既に説明したように、ピクセル形式を設定しない場合、Windows はそれをデバイス依存のビットマップとして認識します。ピクセル形式を設定すると、DIB (デバイスに依存しないビットマップ) が作成されます。これは、ディスプレイ デバイス (グラフィックス カード) から独立していることを意味します。

私はこれと同じ問題を抱えており、pf24bit が唯一の選択肢ではないことを指摘したいと思いました。グラフィックユニットには、次のものもあります。

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

私が取り組んでいるプロジェクトでは、非常に大きなビットマップ (高解像度) を持っていましたが、色が限られていました (いくつかの単純なコードからビットマップ全体を作成していた) ため、8 ビット オプションが必要なものに最適であることがわかりました。 .

そのため、pf24bit 以外のいくつかを試して、実稼働環境に最適なものを見つけてください。pf8bit オプションでかなりの内部メモリを節約できました。

于 2012-10-25T15:26:36.637 に答える
6

次のようにピクセル形式を設定します。

LargeBmp.PixelFormat := pf24Bit;

私は同じ問題を数回抱えていましたが、それは常に解決しました。

于 2012-10-25T08:03:01.467 に答える
5

作成されたビットマップ (デフォルト) は、何らかのバッファーに格納されます。そのバッファのサイズは、ビデオドライバ、OS に依存し、他に何があるかは神のみぞ知るです。このバッファは非常に小さい (約 20 ~ 25 MB) 場合があり、それ以上作成しようとすると失敗します。

これを回避するには、TBitmap の代わりに DIB を作成するか、に変更Pixelformatしてみてくださいpf24bit。これにより、GDI バッファの代わりにユーザーのメモリにビットマップを作成するようにシステムに指示します。

さて、あなたが尋ねるwin7で失敗しないのはなぜですか?わかりました。おそらく GDI がないためですが、代わりに GDI+ と Direct2D が wi​​n 7 で使用されます。他のドライバーのバージョンかもしれませんが、わかりません。

于 2012-10-25T08:49:55.283 に答える