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;确保矩形完全在图像的范围内。

于 2010-10-07T07:57:39.320 回答