当前位置:  开发笔记 > 编程语言 > 正文

Image.Save(..)抛出GDI +异常,因为内存流已关闭

如何解决《Image.Save(..)抛出GDI+异常,因为内存流已关闭》经验,为你挑选了3个好方法。

我有一些二进制数据,我想保存为图像.当我尝试保存图像时,如果用于创建图像的内存流在保存之前关闭,则会引发异常.我这样做的原因是因为我正在动态创建图像,因此我需要使用内存流.

这是代码:

[TestMethod]
public void TestMethod1()
{
    // Grab the binary data.
    byte[] data = File.ReadAllBytes("Chick.jpg");

    // Read in the data but do not close, before using the stream.
    Stream originalBinaryDataStream = new MemoryStream(data);
    Bitmap image = new Bitmap(originalBinaryDataStream);
    image.Save(@"c:\test.jpg");
    originalBinaryDataStream.Dispose();

    // Now lets use a nice dispose, etc...
    Bitmap2 image2;
    using (Stream originalBinaryDataStream2 = new MemoryStream(data))
    {
        image2 = new Bitmap(originalBinaryDataStream2);
    }

    image2.Save(@"C:\temp\pewpew.jpg"); // This throws the GDI+ exception.
}

有没有人对如何在关闭流的情况下保存图像有任何建议?我不能依赖开发人员记住在保存图像后关闭流.实际上,开发人员没有使用内存流生成映像的IDEA(因为它发生在其他地方的其他代码中).

我真的很困惑:(



1> Jon Skeet..:

因为它是一个MemoryStream,你真的不需要关闭流 - 如果你不这样做会发生任何不好的事情,尽管显然最好处理任何可以丢弃的东西.(有关此问题的更多信息,请参阅此问题.)

但是,您应该处理Bitmap - 这将为您关闭流.基本上,一旦你给Bitmap构造函数一个流,它"拥有"流,你不应该关闭它.正如该构造函数的文档所说:

您必须在Bitmap的生命周期内保持流打开.

我在处理位图时找不到任何承诺关闭流的文档,但是你应该能够相当容易地验证它.


真棒!乔恩,这是一个很好的回答.做得很好(我在文档中忽略了关于流的一点).太棒了!当我给它一个去的时候我会报告:)

2> Houman..:

GDI +中发生了一般错误. 也可能是因为保存路径不正确!我花了半天才注意到这一点.因此,请确保您已双重检查路径以保存图像.


我很高兴看到这个,我的路径是`C\Users\mason\Desktop\pic.png`.缺少冒号!在我注意到这一点之前,我会永远消磨.
不正确还意味着您要保存图像的文件夹不存在.

3> 小智..:

也许值得一提的是,如果C:\ Temp目录不存在,即使您的流仍然存在,它也会抛出此异常.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有