Ответы с форумов MSDN

Windows Forms - Объект Image, загруженный в PictureBox, работает некорректно

Date: 08.06.2018 6:58:20

На самом деле, никаких чудес нет. PictureBox.Load создает на основе файла поток и использует для загрузки изображения метод Image.FromStream. В .NET 2.0 он при этом освобождает базовый поток сразу же после создания изображения, оставляя иозображение в частично некорректном состоянии (рисование работает, но сохранение или считывание свойств EXIF - нет). В .NET 4.0 он не освобождает поток и сохраняет его в поле класса (пользуясь IL Disassembler, можно увидеть в 4.0 у класса PictureBox поле localImageStreamReader, которого нет в предыдущих версиях), так что поток существует в течение всего времени жизни Image, и все нормально работает. 

Способ обхода вы уже сами написали. В качестве альтернативы можно клонировать Bitmap перед сохранением:

Bitmap bmp = new Bitmap(_box.Image);
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);

Message 441

Date: 08.06.2018 9:00:46

Это не версия, это факт. Я отвечал не на первое сообщение, а на это:

Если оно прочитано так:

Картинка.Load( имя_файла );

То при записи в поток может возникнуть прерывание.

Если оно было прочитано так:

Картинка.Image = new Bitmap( имя_файла );

То запись в поток происходит без сбоев.
В котором вы, очевидно, работаете не с клоном. В первом сообщении не видно, откуда берется Image, поэтому ничего определенного сказать нельзя. 

"Во-вторых, из этого предположения следует, что каким-то чудесным образом в другом моём примере каждый раз перед сохранением «плохой» картинки успевает отработать сборщик мусора. А если картинка «хорошая», то он вообще не считает нужным работать."

Это не так. Причем тут сборщик мусора? Stream явно освобождается вызовом Dispose. А что такое "хорошая картинка"? У меня на всех падает

+ Под клонированием я понимаю не "картинка.Clone() ", а "new Bitmap(картинка);". Первый вариант не решает проблему, картинка все равно остается некорректной.

Message 440

Date: 08.06.2018 9:43:54

То PNG, да, для них работает, видимо из-за отсутствия метаданных. JPEG ни одного не нашел "хорошего".

Message 439

Date: 08.06.2018 10:02:16

У меня этого не наблюдается. После сохранения "плохой" JPEG в PNG она становится "хорошей". Иными словами, ошибка отчетливо проявляется на всех JPEG и ни на одном PNG.

Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub