Сбой Image.Save: {"Значение не может быть нулевым. \ R \ nИмя параметра: кодировщик"} - PullRequest
15 голосов
/ 31 января 2012

Я пытаюсь сохранить изображение в MemoryStream, но оно не работает при определенных условиях.

Вот код:

Следующий код завершается успешно:

Image img = Bitmap.FromStream(fileStream);
MemoryStream ms = new MemoryStream();
img.Save(ms, img.RawFormat);  // This succeeds.

Сбой следующего кода:

Image img = Bitmap.FromStream(fileStream);
Image thumb = img.GetThumbnailImage(thumbWidth, thumbHeight, null, System.IntPtr.Zero);

MemoryStream ms = new MemoryStream();
thumb.Save(ms, thumb.RawFormat);  // This fails.

Обратите внимание, что второй фрагмент использует изображение, созданное с использованием Image.GetThumbnailImage.

В чем разница? У кого-нибудь есть идеи, почему он не работает?

1 Ответ

23 голосов
/ 31 января 2012

Я думаю, что проблема связана с этой частью GetThumbnailImage документации :

Если Изображение содержит внедренное уменьшенное изображение, этот метод извлекает встроенное уменьшенное изображение и масштабирует его до требуемого размера. Если Изображение не содержит встроенного миниатюрного изображения, этот метод создает миниатюрное изображение путем масштабирования основного изображения.

Это, вероятно, объясняет прерывистое поведение (AKA "определенные условия"). Объяснение приведено в следующем билете Microsoft Connect :

Базовый API не может найти кодировщик для типа изображения MemoryBmp. Нам нужно будет расследовать это будет команда GDI +. Тем временем вы должны иметь возможность просто изменить свой ImageFormat на ImageFormat.Bmp, а не ImageFormat.MemoryBmp, и он должен работать. Он все еще будет сохранен в MemoryStream в формате BMP.

По всей вероятности, если встроенного эскиза нет, новый эскиз, сгенерированный API GetThumbnailImage, фактически будет иметь RawFormat из MemoryBmp, который не имеет связанного кодера - таким образом, конкретное сообщение об ошибке вы Вижу.

Только не используйте thumb.RawFormat; поскольку вы все равно знаете, что это растровое изображение, используйте ImageFormat.Bmp.

P.S. Обратите внимание, что хотя я и удалил свой предыдущий ответ, поскольку он оказался не относящимся к данной конкретной проблеме, все же важно правильно использовать API GetThumbnailImage, как указано в документации; вы должны передать действительный делегат для параметра callback вместо null, в противном случае это может привести к сбою, и вам все равно нужно будет обернуть одноразовые элементы в предложения using.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...