Image.Save不会将图像数据保存到文件中

时间:2016-02-02 00:38:06

标签: c# image image-processing gdi+ system.drawing

我正在使用Windows窗体应用程序从网站和网站获取jpeg图像并将其显示在Image控件中。但是,当我尝试使用Image.Save函数将图像保存到文件系统时,它会创建文件但将其保留为空。不确定我做错了什么......

在下文中,DownloadData()成功检索包含图像的字节数组。

byte[] imageData = DownloadData(); 
MemoryStream stream = new MemoryStream(imageData);
Image img = Image.FromStream(stream);
stream.Close();
picMain.Image = img;
string fname = @"C:\Users\mikec1\Pictures\Construction\Construction_" + Now.ToString("yyyyMMdd") + "_" + Now.ToString("HHmmss") + ".jpg";
picMain.Image.Save(fname, System.Drawing.Imaging.ImageFormat.Jpeg);

如果我从img对象执行Save,我会得到相同的结果。

实际上,应用程序在执行最后一行时终止,而不会显然抛出异常。

2 个答案:

答案 0 :(得分:4)

您的问题是使用Image实例化的FromStream要求流在Image的生命周期内保持打开状态。摆脱stream.Close(),它应该没问题。有关详细信息,请参阅msdn

答案 1 :(得分:2)

我尝试了您的代码,它抛出ExternalException,说A generic error occurred in GDI+,没有任何InnerException,也创建了一个空文件。省略该行使图像显示在窗体上就好了。改变.NET版本似乎没有任何影响。

虽然我不确定为什么会发生这种情况请参阅Simon's answer,您可以完全通过使用

来避免此问题
System.IO.File.WriteAllBytes(fname, imageData);

而不是

picMain.Image.Save(fname, System.Drawing.Imaging.ImageFormat.Jpeg);

它也应该使用更少的开销,因为Image.Save必须在保存之前先处理图像格式,并且你已经拥有了你的字节数组。