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