1

ビットマップのサイズを変更する関数があります。これは、別のプロジェクトからコピーしただけの「パンとバター」操作です。

private Bitmap ResizeBitmap(Bitmap orig)
{
    Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale);
    resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
    using (Graphics g = Graphics.FromImage(resized))
    {
        g.DrawImage(orig, 0, 0, resized.Width, resized.Height);
    }
    return resized;
}

ただし、 で OutOfMemory 例外が発生し続けましたGraphics g = Graphics.FromImage(resized)

GDI に関して言えば、OutOfMemory 例外は通常、他の問題を隠していることを認識しています。また、サイズを変更しようとしている画像が大きくないこと、および (私が知る限り) GC が現在のスコープを離れる際にインスタンスを収集するのに問題がないことも十分に認識しています。

とにかく、私は今それを少しいじっていて、現在は次のようになっています:

private Bitmap ResizeBitmap(Bitmap orig)
{
    lock(orig)
    {
        using (Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale))
        {
            resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
            using (Graphics g = Graphics.FromImage(resized))
            {
                g.DrawImage(orig, 0, 0, resized.Width, resized.Height);
            }
            return resized;
        }
    }
}

しかし、今では InvalidOperation 例外が発生していますresized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);

私は暗闇の中でぶらぶらするのにうんざりしています。これらの厄介な GDI 操作をトラブルシューティングするより良い方法はありますか?

4

1 に答える 1

2

Graphics.FromImageメソッド定義から:

画像がインデックス付きピクセル形式の場合、このメソッドは例外をスローし、「インデックス付きピクセル形式の画像から Graphics オブジェクトを作成することはできません」というメッセージを返します。

取得する例外は本当に誤解を招くものですが、サポートされていない操作を実行しようとしています。このビットマップのサイズを GDI+ ビットマップとしてではなく、生のメモリ ブロックとして変更する必要があるようです。

于 2012-10-02T15:31:18.310 に答える