ビットマップのサイズを変更する関数があります。これは、別のプロジェクトからコピーしただけの「パンとバター」操作です。
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 操作をトラブルシューティングするより良い方法はありますか?