Я думаю, что проблема связана с этой частью 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
.