Как заявляет кто-то другой, это известная ошибка GDI +.
Однако обычно она появляется, когда вы закрыли поток source изображения перед тем, как полностью его прочитать.Просто загрузка нового объекта Image будет загружать только метаданные, такие как ширина, высота, глубина цвета и т. Д., А не фактические пиксели.Они будут лениво загружаться позже.
Этого можно избежать, скопировав ваше изображение (во время загрузки) в новое изображение, созданное в памяти.Я предполагаю, что входной поток все еще доступен в то время.Если у вас есть новый класс Image на основе памяти, вы можете свободно распоряжаться исходным потоком.(Другое решение - не закрывать / не удалять исходный поток.)
Редактировать: проблема описана в KB814675 Зависимости растрового изображения и конструктора изображения вместе с обходным решением.
Создание неиндексированного изображения
Этот подход требует, чтобы новое изображение было в неиндексированном пиксельном формате (более 8 бит на пиксель), даже если оригинализображение было в индексированном формате.Этот обходной путь использует метод Graphics.DrawImage () для копирования изображения в новый растровый объект:
- Создание исходного растрового изображения из потока, из памяти или из файла.
- Создайте новое растровое изображение того же размера с форматом пикселя более 8 бит на пиксель (BPP).
- Используйте метод Graphics.FromImage () для получения объекта Graphics для второгоРастровое изображение.
- Используйте Graphics.DrawImage () для рисования первого растрового изображения на втором растровом изображении.
- Используйте Graphics.Dispose () для удаления графического объекта.
- Использование растрового изображения.Dispose () для удаления первого растрового изображения.
Создание индексированного изображения
Этот обходной путь создает объект битовой карты в индексированном формате:
- Создайте исходную битовую карту изпоток, из памяти или из файла.
- Создайте новое растровое изображение с тем же размером и форматом пикселя, что и у первого растрового изображения.
- Используйте метод Bitmap.LockBits () для блокировкиполное изображение для обоих объектов Bitmap в их собственном формате пикселей.
- Используйте функцию Marshal.Copy или другую функцию копирования памяти, чтобы скопировать биты изображения из первого Bitmap во второе Bitmap.
- Используйте метод Bitmap.UnlockBits (), чтобы разблокировать оба объекта Bitmap.
- Используйте Bitmap.Dispose (), чтобы избавиться от первого Bitmap.