Произошла общая ошибка в GDI +, JPEG Image для MemoryStream - PullRequest
302 голосов
/ 27 июня 2009

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

Странно, но это прекрасно работает с png, но выдает вышеуказанную ошибку с jpg и gif, что довольно запутанно.

Большинство подобных проблем связаны с сохранением изображений в файлы без разрешений. По иронии судьбы решение состоит в том, чтобы использовать поток памяти, как я делаю ....

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    using (var ms = new MemoryStream())
    {
        ImageFormat format;
        switch (imageToConvert.MimeType())
        {
            case "image/png":
                format = ImageFormat.Png;
                break;
            case "image/gif":
                format = ImageFormat.Gif;
                break;
            default:
                format = ImageFormat.Jpeg;
                break;
        }

        imageToConvert.Save(ms, format);
        return ms.ToArray();
    }
}

Более подробно с исключением. Причиной, по которой это вызывает так много проблем, является отсутствие объяснения: (

System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters    encoderParams)
   at System.Drawing.Image.Save(Stream stream, ImageFormat format)
   at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.cs:line 132
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
 InnerException: 

ОК, вещи, которые я пробовал до сих пор.

  1. Клонирование изображения и работа над этим.
  2. Извлечение кодера для этого MIME с передачей с настройкой качества JPEG.

Ответы [ 30 ]

2 голосов
/ 27 июня 2009

Я заметил, что ваш случай "jpeg" на самом деле:

            default:
                format = ImageFormat.Jpeg;
                break;

Вы уверены, что формат jpeg, а не что-то еще?

Я бы попробовал:

            case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

Или проверьте, что на самом деле возвращает imageToConvert.MimeType().

UPDATE

Есть ли какая-либо другая инициализация, которую вам нужно сделать для объекта MemoryStream?

1 голос
/ 10 марта 2015

Я также получаю эту ошибку, потому что я пытаюсь сохранить изображения с тем же именем предыдущих сохраненных изображений.

Убедитесь, что вы не сохраняете изображения с повторяющимся именем.

Использовать, например, функцию 'Random' ( Как работает генератор случайных чисел в C #? ) или, например, создать Guid (http://betterexplained.com/articles/the-quick-guide-to-guids/)

1 голос
/ 09 сентября 2013
byte[] bts = (byte[])page1.EnhMetaFileBits; 
using (var ms = new MemoryStream(bts)) 
{ 
    var image = System.Drawing.Image.FromStream(ms); 
    System.Drawing.Image img = image.GetThumbnailImage(200, 260, null, IntPtr.Zero);      
    img.Save(NewPath, System.Drawing.Imaging.ImageFormat.Png);
}
1 голос
/ 02 июля 2018

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

Перезапустите пул приложений Исправьте проблему.

Надеюсь, это кому-нибудь поможет.

1 голос
/ 11 января 2013

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

0 голосов
/ 16 февраля 2013

Я тоже столкнулся с проблемой. Проблема была в том, что поток загрузки был утилизирован. Но я не распоряжался им, это было внутри .Net framework. Все, что мне нужно было сделать, это использовать:

image_instance = Image.FromFile(file_name);

вместо

image_instance.Load(file_name);

image_instance имеет тип System.Windows.Forms.PictureBox! Функция PictureBox Load () удаляет поток, из которого было загружено изображение, и я этого не знал.

0 голосов
/ 10 июня 2019

Возможные проблемы, которые вызывают такую ​​ошибку:

  1. Каталог не существует (метод, который вы вызываете, не будет автоматически создавать этот каталог для вас)
  2. Разрешения безопасности на запись в выходной каталог не позволяют пользователю, выполняющему приложение, писать

Надеюсь, это поможет, это исправило мою проблему, я просто убедился, что выходной каталог существует, перед сохранением выходного изображения!

0 голосов
/ 07 января 2016

Исходя из ответа @savindra, если вы RHM в своем приложении и попытаетесь запустить в качестве администратора , то это должно решить вашу проблему.

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

0 голосов
/ 11 июня 2019

Простой, создание нового экземпляра Bitmap решает проблему.

string imagePath = Path.Combine(Environment.CurrentDirectory, $"Bhatti{i}.png");
Bitmap bitmap = new Bitmap(image);
bitmap.Save(imagePath);
0 голосов
/ 11 февраля 2013

Для меня я использовал Image.Save(Stream, ImageCodecInfo, EncoderParameters), и, очевидно, это вызывало печально известную ошибку A generic error occurred in GDI+.

Я пытался использовать EncoderParameter, чтобы сохранить JPEG в 100% качестве. Это отлично работало на "моей машине" (дох!), А не на производстве.

Когда я использовал Image.Save(Stream, ImageFormat), ошибка исчезла! Поэтому, как идиот, я продолжал использовать последние, хотя они сохраняют их в качестве по умолчанию, которое, как я полагаю, составляет всего 50%.

Надеюсь, эта информация кому-нибудь поможет.

...