В GDI + произошла общая ошибка - PullRequest
4 голосов
/ 26 января 2011

Я пытаюсь изменить размер и изображение с помощью следующей функции и получаю эту ошибку:

Сведения об исключении: System.Runtime.InteropServices.ExternalException: в GDI + произошла общая ошибка в этой строке:

imageConvertedToBitmap.Save(cachedFileName, info[1], encoderParameters);

Есть идеи, почему это может происходить?

private byte[] GetCachedImage(string cachedFileName, string pathToImage, int width, int height)
        {
            if (!System.IO.File.Exists(cachedFileName) || (System.IO.File.GetLastWriteTime(pathToImage) > System.IO.File.GetLastWriteTime(cachedFileName)))
            {
                Image imageToResize = Image.FromFile(pathToImage);
                Image imageConvertedToBitmap = new Bitmap(width, height);

                Graphics graphicsController = Graphics.FromImage(imageConvertedToBitmap);
                graphicsController.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphicsController.SmoothingMode = SmoothingMode.HighQuality;
                graphicsController.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphicsController.CompositingQuality = CompositingQuality.HighQuality;
                graphicsController.DrawImage(imageToResize, 0, 0, width, height);

                EncoderParameters parameters = new EncoderParameters(1);
                parameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);

                ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
                EncoderParameters encoderParameters = new EncoderParameters(1);
                encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);

                MemoryStream memoryStream = new MemoryStream();
                imageConvertedToBitmap.Save(cachedFileName, info[1], encoderParameters);
                imageConvertedToBitmap.Save(memoryStream, info[1], encoderParameters);

                imageToResize.Dispose();
                imageConvertedToBitmap.Dispose();
                graphicsController.Dispose();
                parameters.Dispose();
                encoderParameters.Dispose();

                return memoryStream.GetBuffer();
            }

            byte[] buffer = null;

            try
            {
                FileStream fileStream = new FileStream(cachedFileName, FileMode.Open, FileAccess.Read);
                BinaryReader binaryReader = new BinaryReader(fileStream);

                long totalBytes = new FileInfo(cachedFileName).Length;

                buffer = binaryReader.ReadBytes((Int32)totalBytes);

                fileStream.Close();
                fileStream.Dispose();
                binaryReader.Close();
            }
            catch { }

            return buffer;
        }

Ответы [ 3 ]

4 голосов
/ 26 января 2011

Это была ошибка прав доступа. Пришлось дать соответствующее разрешение на запись в каталог, в который я сохранял. Иногда это простые вещи. :)

Из того, что я прочитал, при получении этой ошибки GDI + первое, что нужно проверить, должны быть права доступа, поскольку это почти всегда показатель проблемы с безопасностью.

0 голосов
/ 26 января 2011

У меня была эта ошибка один раз, потому что я пытался сохранить под заблокированным файлом объект Bitmap.Мы просто видим ваш метод, а не то, как вы его используете.

Я думаю, что в вашем коде есть несколько синтаксических проблем: вы должны использовать "using () {}" для всех объектов отключения в вашем коде.

using(Image imageToResize = Image.FromFile(pathToImage))
using(Image imageConvertedToBitmap = new Bitmap(width, height))
etc.
{
}
0 голосов
/ 26 января 2011

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

...