У меня есть двоичные данные, которые я хочу сохранить как изображение. Когда я пытаюсь сохранить изображение, возникает исключение, если поток памяти, использованный для создания изображения, был закрыт перед сохранением. Причина, по которой я это делаю, заключается в том, что я динамически создаю изображения, и поэтому мне нужно использовать поток памяти.
это код:
[TestMethod]
public void TestMethod1()
{
// Grab the binary data.
byte[] data = File.ReadAllBytes("Chick.jpg");
// Read in the data but do not close, before using the stream.
Stream originalBinaryDataStream = new MemoryStream(data);
Bitmap image = new Bitmap(originalBinaryDataStream);
image.Save(@"c:\test.jpg");
originalBinaryDataStream.Dispose();
// Now lets use a nice dispose, etc...
Bitmap2 image2;
using (Stream originalBinaryDataStream2 = new MemoryStream(data))
{
image2 = new Bitmap(originalBinaryDataStream2);
}
image2.Save(@"C:\temp\pewpew.jpg"); // This throws the GDI+ exception.
}
Есть ли у кого-нибудь предложения, как я могу сохранить изображение с закрытым потоком? Я не могу рассчитывать на то, что разработчики не забудут закрыть поток после сохранения изображения. Фактически, у разработчика НЕ БЫЛО ИДЕИ о том, что изображение было создано с использованием потока памяти (потому что это происходит в каком-то другом коде, где-то еще).
Я действительно смущен :(
using
блока. Я думаю, что онoriginalBinaryDataStream2
был автоматически утилизирован в конце использования. И это вызовет исключение.Ответы:
Поскольку это MemoryStream, вам действительно не нужно закрывать поток - ничего плохого не произойдет, если вы этого не сделаете, хотя, очевидно, это хорошая практика в любом случае избавляться от всего одноразового. (Подробнее об этом см. В этом вопросе .)
Однако вы должны удалить Bitmap - и это закроет для вас поток. Обычно, когда вы передаете конструктору Bitmap поток, он «владеет» потоком, и вам не следует его закрывать. Как говорится в документации для этого конструктора :
Я не могу найти никаких документов, обещающих закрыть поток при удалении растрового изображения, но вы сможете довольно легко это проверить.
источник
Общая ошибка произошла в GDI +. Также может быть результатом неправильного пути сохранения ! У меня ушло полдня, чтобы это заметить. Поэтому убедитесь, что вы дважды проверили путь, чтобы сохранить изображение.
источник
C\Users\mason\Desktop\pic.png
. Отсутствует двоеточие! Я бы потратил вечность, прежде чем заметил бы это.Возможно, стоит упомянуть, что если каталог C: \ Temp не существует, он также вызовет это исключение, даже если ваш поток все еще существует.
источник
У меня была та же проблема, но на самом деле причина заключалась в том, что у приложения не было разрешения на сохранение файлов на C. Когда я перешел на «D: \ ..», изображение было сохранено.
источник
Скопируйте растровое изображение. Вы должны держать поток открытым в течение всего времени существования растрового изображения.
При рисовании изображения: System.Runtime.InteropServices.ExternalException: в GDI произошла общая ошибка
источник
RawFormat
Хотя не уверен, насколько это важно. Если вы хотите использовать это, извлеките его из объекта где-нибудь по пути, но в целом сохраните его как тот тип, который вы действительно хотите иметь .Вы можете попробовать создать еще одну копию растрового изображения:
источник
Эта ошибка возникла у меня, когда я пытался из Citrix. Папка изображений была установлена на C: \ на сервере, для которого у меня нет прав. Как только папка с изображениями была перемещена на общий диск, ошибка исчезла.
источник
Общая ошибка произошла в GDI +. Это может произойти из-за проблем с путями хранения изображений. Я получил эту ошибку, потому что мой путь хранения слишком длинный. Я исправил это, сначала сохранив изображение по кратчайшему пути и переместив его в правильное место с помощью методов обработки длинного пути.
источник
Я получал эту ошибку, потому что автоматизированный тест, который я выполнял, пытался сохранить снимки в несуществующей папке. После того, как я создал папку, ошибка разрешилась
источник
Одно странное решение, которое заставило мой код работать. Откройте изображение в краске и сохраните его как новый файл в том же формате (.jpg). Теперь попробуйте с этим новым файлом, и он работает. Это ясно объясняет вам, что файл может быть каким-то образом поврежден. Это может помочь, только если в вашем коде исправлены все остальные ошибки.
источник
Это также появилось у меня, когда я пытался сохранить изображение в путь
C:\Program Files (x86)\some_directory
и
.exe
не был запущен для запуска от имени администратора, я надеюсь, что это может помочь тем, у кого такая же проблема.источник
Для меня код ниже разбился
A generic error occurred in GDI+
в строке, которая сохраняет вMemoryStream
. Код выполнялся на веб-сервере, и я решил его, остановив и запустив пул приложений, на котором работал сайт.Должна быть какая-то внутренняя ошибка в GDI +
источник
Я столкнулся с этой ошибкой, когда пытался выполнить простое редактирование изображений в приложении WPF.
Установка источника элемента изображения на растровое изображение предотвращает сохранение файла. Даже установка Source = null, похоже, не освобождает файл.
Теперь я просто никогда не использую изображение в качестве элемента Source of Image, поэтому я могу перезаписать его после редактирования!
РЕДАКТИРОВАТЬ
Услышав о свойстве CacheOption (благодаря @Nyerguds), я нашел решение: поэтому вместо использования конструктора Bitmap я должен установить Uri после настройки
CacheOption
BitmapCacheOption.OnLoad
. (Image1
НижеImage
элемент Wpf )Вместо того
Использование:
См. Это: Кэширование изображений WPF
источник
BitmapCacheOption.OnLoad
чтобы отключить их от источника загрузки.Попробуйте этот код:
источник
Я использовал обработчик изображений для изменения размера изображений, и однажды я получил исключение «Общая ошибка произошла в GDI +».
Посмотрев некоторое время, я попытался переработать пул приложений, и бинго работает. Я отмечаю это здесь, надеюсь, это поможет;)
Ура
источник