Подтвердить что ты не робот

Общая ошибка произошла в GDI + на System.Drawing.Image.Save

Исключение:

Общая ошибка произошла в GDI+.  в System.Drawing.Image.Save(String filename, кодировщик ImageCodecInfo, EncoderParameters encoderParams)  в System.Drawing.Image.Save(String filename, формат ImageFormat)  в System.Drawing.Image.Save(String filename)

Код:

byte[] bitmapData = new byte[imageText.Length];
MemoryStream streamBitmap;
bitmapData = Convert.FromBase64String(imageText);
streamBitmap = new MemoryStream(bitmapData);
System.Drawing.Image img = Image.FromStream(streamBitmap);
img.Save(path);

Мы преобразуем строку base64 в MemoryStream, а затем создаем System.Drawing.Image(Image.FromStream(streamBitmap)). В конце изображение сохраняется в временном файле.

Странно то, что проблема возникает, когда активность (количество одновременных пользователей) высока на веб-сервере, и проблема решается временно после IISRESET или утилизации пула приложений...

== > Вопрос сборщика мусора?

Я уже проверил разрешение папки TEMP...

4b9b3361

Ответ 1

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

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

byte[] bitmapData = new byte[imageText.Length];
bitmapData = Convert.FromBase64String(imageText);

  using (var streamBitmap = new MemoryStream(bitmapData)
  {
      using (img = Image.FromStream(streamBitmap))
      { 
         img.Save(path);
      }
  }

Вот несколько ссылок на темы, обсуждающие подобные проблемы

gdi+ ошибка при сохранении изображения с веб-страницы

При рисовании изображения: System.Runtime.InteropServices.ExternalException: в GDI произошла общая ошибка

Ответ 2

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

Ответ 3

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

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

Ответ 4

В моем случае приведенный ниже фрагмент кода работает нормально, где ConvertedImageString - это строка Base64Image, полученная от API, и я преобразую ее в связанное изображение с форматом и сохраню в физической папке на сервере.

Изменить: Возможно, указанная выше ошибка возникла из-за неправильного пути к файлу, по которому вы пытаетесь сохранить изображение

string converted = ConvertedImageString.Replace('-', '+');
converted = converted.Replace('_', '/');
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ConvertedImageString)))
{
    using (Bitmap bm1 = new Bitmap(ms))
    {
        newFileName =  id + ".jpg";
        newFileName = CleanFileName(newFileName);
        newFileName = newFileName.Replace(" ", "_");

        Path = Path + newFileName;

        bm1.Save(Path, ImageFormat.Jpeg);
    }
}

Ответ 5

Когда вы вызываете "Image.FromFile" или "Image.Save", объект изображения будет блокировать файл до тех пор, пока он не будет явно удален. Если вы выполняете другое "Image.Save" или "Image.FromFile" для того же имени файла, вы можете получить исключение "универсальная ошибка". Это зависит от того, утилизировал ли сборщик мусора изображение, поэтому результаты противоречивы.

Если вам не нужно изображение после действия "Сохранить", вы должны немедленно утилизировать его. Если вам действительно нужно изображение, Image.Clone сделает копию, которая не удерживает блокировку исходного файла.

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