Image.Save无法将图像数据保存到文件中。

4

我有一个工作中的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,我会得到相同的结果。

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


1
如果您省略掉文件保存代码,那么使用 picMain.Image = img; 这行代码图片会正确地显示吗? - user585968
是的,它至少能够正确地执行那个操作。 - Cyberherbalist
2个回答

4
你的问题在于使用FromStream实例化的Image需要流维持打开状态,直到Image的生命周期结束。移除stream.Close()即可解决问题。详细信息请参见msdn

1
不错的回答,Simon!非常顺畅! - Cyberherbalist

3
我尝试了你的代码,但它抛出了一个"ExternalException"异常,显示"A generic error occurred in GDI+",没有任何"InnerException",同时创建了一个空文件。删除那一行后,图像能够正常显示在表单上。更改.NET版本似乎没有任何影响。
虽然我不确定为什么会发生这种情况,但你可以通过使用Simon的答案来完全避免这个问题。
System.IO.File.WriteAllBytes(fname, imageData);

替代

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

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


好的回答,和@SimonMcKenzie给出的一样好!我看到你是立陶宛人!太棒了!我已故的妻子的父母都在很久以前 Memel(现在的克莱佩达)出生,当时那里还是德国的一部分!当然,他们称其为Memel,但无论如何。 - Cyberherbalist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接