4

15000x3000 のような大きくて大きな画像を生成する必要があります。この画像を GDI+、クラスBitmapで生成します。

もちろん、Bitmap をインスタンス化するためのメモリがなくなるため、生成が失敗することがあります。私の目標は、生成できる画像の最大サイズをユーザーに知らせることです。

メッセージは次のようになります。

サイズ 15000x3000 のイメージを生成しようとしましたが、メモリが不足しています。利用可能な最大サイズは 10000x3000 または 15000x1000 です。

メッセージを作成するアイデアは次のようなものです。

public bool CanCreateBitmap(Size size, out string message)
{
    long availableMemory = this.GetAvailableContiguousMemory();
    long bytesRequiered = (long)size.Width * size.Height * 32;

    if (availableMemory < bytesRequiered)
    {
        var sizeProposal1 = new Size(size.Width, (int)(availableMemory / (32 * size.Width)));
        var sizeProposal2 = new Size((int)(availableMemory / (32 * size.Height)), size.Height);

        message = string.Format("You tried to generate an image of size {0}, but there is not enough memory."
                + Environment.NewLine + "The maximum size available is {1}, or {2}."
                , size, sizeProposal1, sizeProposal2);

        return false;
    }
    else
    {
        message = "";
        return true;
    }
}

しかし、関数のコードがありませんGetAvailableContiguousMemory()

.Net で連続したメモリを取得する方法はありますか?
目標を達成するために正しい質問をしていますか?

4

2 に答える 2

3

この種の通知は、実際にはユーザーの役に立たない応急処置です。彼らは本当にその大きなビットマップを作成したかったのですが、恣意的に小さいビットマップは彼らが望んでいたものではありませんでした. とにかくこれを行いたい場合は、VirtualQuery をピンボークして仮想アドレス空間を歩き回り、まだマップされていないチャンクを見つける必要があります。

最近、この問題が発生しても意味がありません。プロジェクトのプラットフォーム ターゲット設定を AnyCPU に変更して、プログラムが 64 ビット オペレーティング システムで利用可能な仮想メモリ スペースのゴブを使用できるようにします。

于 2013-05-22T09:39:39.130 に答える