C#使用控制台应用程序进行图像处理';内存不足';例外情况

C#使用控制台应用程序进行图像处理';内存不足';例外情况,c#,console-application,image-manipulation,crop,C#,Console Application,Image Manipulation,Crop,我有一个控制台应用程序,可以成功地重新调整图像大小,同时保持纵横比 我现在需要裁剪图像,我使用的代码如下: using (var thumbnail = CropPicture(image, rectangle)) { EncoderParameters encParams = new EncoderParameters(1); encParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Qua

我有一个控制台应用程序,可以成功地重新调整图像大小,同时保持纵横比

我现在需要裁剪图像,我使用的代码如下:

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%确定。

根据示例,如果第一个参数是“源位图边界之外”,则会抛出OutOfMemoryException


验证位图的第一个参数。克隆;确保rect完全在图像的边界内。

而不是在using语句中返回图像,为什么不在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;
}

我不确定,但在您返回图像之前,位图似乎未被处理。

感谢您的回复此答案和另一个帮助我解决问题的答案,正在获取包括临时缩略图在内的所有图像。。。无限循环。这让我找到了你的答案,最终图像变成了15x15,矩形超范围,干杯:)