0

アスペクト比を維持しながら画像のサイズを変更できるコンソールアプリケーションがあります。

ここで、使用しているコードが以下の画像をトリミングする必要があります。

using (var thumbnail = CropPicture(image, rectangle)) {
    EncoderParameters encParams = new EncoderParameters(1);
    encParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)90);

    thumbnail.Save(destination, GetImageCodecInfo(image.RawFormat), encParams); 
}

public static Image CropPicture(Image source, Rectangle cropArea) {
    using (var bitmap = new Bitmap(source)) {
        return (Image)(bitmap.Clone(cropArea, source.PixelFormat));
    }
}

行にメモリ不足の例外がスローされているようです

return (Image)(bitmap.Clone(cropArea, source.PixelFormat));

何が起こっているのかアイデアはありますか?開いているファイルだと思いますが、100%確実ではありません。

4

2 に答える 2

1

using ステートメント内で Image を返す代わりに、using ステートメント内でそれを返す前に参照を作成しないでください。

public static Image CropPicture(Image source, Rectangle cropArea) {
    Bitmap retImg;
    using (var bitmap = new Bitmap(source)) {
        retImg = bitmap.Clone(cropArea, source.PixelFormat);
    }
    return (Image)regImg;
}

よくわかりませんが、画像を返す前にビットマップが破棄されていないようです。

于 2010-10-07T08:04:58.143 に答える
0

MSDN のドキュメントによると、Bitmap.Clone(Rectangle, PixelFormat)は、最初のパラメーターが「ソース ビットマップ境界の外側」にある場合、OutOfMemoryException をスローする可能性があります。

への最初のパラメータを確認しますBitmap.Clone。rect が完全に画像の境界内にあることを確認してください。

于 2010-10-07T07:57:39.320 に答える