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);
Date: 08.06.2018 9:00:46
Это не версия, это факт. Я отвечал не на первое сообщение, а на это:
Если оно прочитано так: Картинка.Load( имя_файла ); То при записи в поток может возникнуть прерывание. Если оно было прочитано так: Картинка.Image = new Bitmap( имя_файла ); То запись в поток происходит без сбоев.В котором вы, очевидно, работаете не с клоном. В первом сообщении не видно, откуда берется Image, поэтому ничего определенного сказать нельзя.
"Во-вторых, из этого предположения следует, что каким-то чудесным образом в другом моём примере каждый раз перед сохранением «плохой» картинки успевает отработать сборщик мусора. А если картинка «хорошая», то он вообще не считает нужным работать."
Это не так. Причем тут сборщик мусора? Stream явно освобождается вызовом Dispose. А что такое "хорошая картинка"? У меня на всех падает
+ Под клонированием я понимаю не "картинка.Clone() ", а "new Bitmap(картинка);". Первый вариант не решает проблему, картинка все равно остается некорректной.Date: 08.06.2018 9:43:54
Date: 08.06.2018 10:02:16
Автор: VadimTagil