Обработка изображений в C # с использованием консольного приложения, выдающего исключение «Недостаточно памяти» - PullRequest
0 голосов
/ 07 октября 2010

У меня есть консольное приложение, которое успешно изменяет размеры изображения, сохраняя соотношение сторон.

Теперь мне нужно обрезать изображение, код которого я использую ниже:

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%.

Ответы [ 2 ]

1 голос
/ 07 октября 2010

вместо того, чтобы возвращать изображение внутри использования, почему бы не создать ссылку перед возвратом его внутри оператора использования.

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;
}

Я не уверен, но похоже, что растровое изображение не удаляется до того, как вы вернете изображение.

0 голосов
/ 07 октября 2010

Согласно документации MSDN, Bitmap.Clone (Rectangle, PixelFormat) может выдать исключение OutOfMemoryException, если первый параметр находится «за пределами границ растрового изображения источника».параметр до Bitmap.Clone;убедитесь, что прямоугольник полностью находится в пределах изображения.

...