C# Image.Save崩溃:{quot;值不能为空。\r\n参数名称:编码器";}

C# Image.Save崩溃:{quot;值不能为空。\r\n参数名称:编码器";},c#,exception,C#,Exception,我试图将图像保存到内存流中,但在某些情况下失败 代码如下: 以下代码成功执行: Image img = Bitmap.FromStream(fileStream); MemoryStream ms = new MemoryStream(); img.Save(ms, img.RawFormat); // This succeeds. 以下代码失败: Image img = Bitmap.FromStream(fileStream); Image thumb = img.GetThumbnai

我试图将图像保存到
内存流中
,但在某些情况下失败

代码如下:

以下代码成功执行:

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
创建的图像


有什么区别?有人知道它为什么会失败吗?

我相信问题与以下部分有关:

如果包含嵌入的缩略图图像,此方法将检索嵌入的缩略图并将其缩放到请求的大小。如果不包含嵌入的缩略图,则此方法通过缩放主图像来创建缩略图

这可能是间歇性行为(又称“某些条件”)的原因。解释如下:

基础API无法找到MemoryBmp图像类型的编码器。我们需要对GDI+团队进行调查。同时,您应该能够简单地将ImageFormat更改为ImageFormat.Bmp,而不是ImageFormat.MemoryBmp,并且它应该可以工作。它仍将使用BMP格式保存到MemoryStream

很有可能,如果没有嵌入的缩略图,那么由
GetThumbnailImage
API生成的新缩略图实际上将具有
RawFormat
MemoryBmp
,它没有相关的编码器-因此您看到的特定错误消息

只是不要使用
thumb.RawFormat
;既然您知道它是位图,请改用
ImageFormat.Bmp

另外,请注意,尽管我删除了我先前的答案,因为它与这个特定问题无关,但按照文档的规定正确使用
GetThumbnailImage
API仍然很重要;您必须为
回调
参数传递一个有效的委托,而不是
null
,否则它可能会失败,您仍然需要使用
子句在
中包装一次性文件。

thumb.Save(ms,thumb.RawFormat)
更改为
thumb.Save(ms,thumb.Bmp)
成功了!