2016-02-02 4 views
2

У меня есть приложение Windows Form, которое получает изображение jpeg и веб-сайт и отображает его в элементе управления Image. Однако, когда я пытаюсь сохранить изображение в файловой системе, используя функцию Image.Save, он создает файл, но оставляет его пустым. Не уверен, что я делаю неправильно ...Image.Save не сохраняет данные изображения в файл

В результате DownloadData() успешно извлекает массив байтов, содержащий изображение.

byte[] imageData = DownloadData(); 
MemoryStream stream = new MemoryStream(imageData); 
Image img = Image.FromStream(stream); 
stream.Close(); 
picMain.Image = img; 
string fname = @"C:\Users\mikec1\Pictures\Construction\Construction_" + Now.ToString("yyyyMMdd") + "_" + Now.ToString("HHmmss") + ".jpg"; 
picMain.Image.Save(fname, System.Drawing.Imaging.ImageFormat.Jpeg); 

Получается тот же результат, если я выполняю сохранение из объекта img.

Фактически приложение прекращает выполнение последней строки, не вызывая явно исключения.

+1

Если вы не укажете код сохранения файла, отображается ли изображение правильно по строке 'picMain.Image = img;'? – MickyD

+0

Да, это действительно так, по крайней мере. – Cyberherbalist

ответ

3

Ваша проблема заключается в том, что созданный Image с использованием FromStream требует, чтобы поток оставался открытым на всю жизнь Image. Избавьтесь от stream.Close(), и все должно быть хорошо. См. msdn.

+1

Хороший ответ, Саймон! Работает как шарм! – Cyberherbalist

2

Я пробовал ваш код, и он бросил ExternalException, заявив A generic error occurred in GDI+, без каких-либо InnerException, также создавая пустой файл. Опуская эту линию, изображение получилось на форме просто отлично. Изменение версий .NET, похоже, не оказало никакого влияния.

Хотя я не уверен, почему это происходит см Simon's answer, вы можете просто полностью избежать этой проблемы с помощью

System.IO.File.WriteAllBytes(fname, imageData); 

вместо

picMain.Image.Save(fname, System.Drawing.Imaging.ImageFormat.Jpeg); 

Она должна использовать меньше накладных расходов, также, так как Image.Save должен иметь дело с форматами изображений перед сохранением, и у вас уже есть массив байтов.

+0

Хороший ответ, работает так же хорошо, как тот, который дал @SimonMcKenzie! И я вижу, что ты литовский! Ницца! Родители моей покойной жены родились в Клайпеде, когда она была частью Германии давным-давно! Конечно, они называли это Мемелем, но неважно. – Cyberherbalist