zoukankan      html  css  js  c++  java
  • GDI+中发生一般性错误 Winform Image.Save(mstream, ImageFormat.Png)引发

    在处理图片时,读取本地图像文件,进行另存时发生GDI+中发生一般性错误 。

    具体情况如下:

    用OpenFileDialog打开图像文件,文件名为filename
    StreamReader sr = new StreamReader(filename);
    Stream sm = sr.BaseStream;
    imgZheng = Image.FromStream(sm);
    
    sm.Close();
    sr.Close();
    
    //将读取到的Image重新写入流,转化为byte[]以便进行进一步的处理
    MemoryStream mmstream = new MemoryStream();
    imgZheng.Save(mmstream, ImageFormat.Png);//执行到此处时会出现“GDI+中发生一般性错误”这个错误。
     byte[] imgByte = null;
    imgByte =  mstream.ToArray();

    原因:在Image.Save时也会发生这种错误,sm.Close(); sr.Close();引起。注销掉就可以正常运行,但是文件被锁定。不注销掉关闭流,再Save()将引起该错误。

    解决方法如下:

    byte[] ImgByte = null;
                            MemoryStream mStream = new MemoryStream();
                            Bitmap bmp = new Bitmap(filename);
                            bmp.Save(mStream, ImageFormat.Png);
                            ImgByte = mStream.ToArray();
                            bmp.Dispose();
                            mStream.Close();
    
                            MemoryStream mstream = new MemoryStream(ImgByte);
                            imgZheng = Image.FromStream(mstream);
                            mstream.Close();     

    //此时再执行Save方法,将不会报错
              MemoryStream mstream = new MemoryStream();
                    imgZheng.Save(mstream, ImageFormat.Png);
    
    

    方法二:

                StreamReader sr = new StreamReader(filename);
                        Stream sm = sr.BaseStream;
                        Image img = Image.FromStream(sm);
                        img = Image.FromStream(sm);
    
               //将图像序列化给指定的流,再将流序列化为二进制数组。 BinaryFormatter binaryFormatter
    = new BinaryFormatter(); MemoryStream mstream = new MemoryStream(); binaryFormatter.Serialize(mstream, img); byte[] ImgByte = mstream.ToArray(); mstream.Close(); sm.Close(); sr.Close();            //将二进制数组放到流中,再反序列为图像 MemoryStream memostream = new MemoryStream(ImgByte); imgZheng = (Image)binaryFormatter.Deserialize(memostream); memostream.Close();

    //此时再执行Save方法,将不会报错
              MemoryStream mstream = new MemoryStream();
                    imgZheng.Save(mstream, ImageFormat.Png);
     

    方法三:(与方法二相比,流的赋值方式不一样,流转换为图像的方式也不一样)

    StreamReader sr = new StreamReader(filename);
                        Stream sm = sr.BaseStream;
                        Image img = Image.FromStream(sm);
                        img = Image.FromStream(sm);
    
                        
                        MemoryStream mstream = new MemoryStream();
                        img.Save(mstream, ImageFormat.Png);
                        byte[] ImgByte = mstream.ToArray();
                        mstream.Close();
                        sm.Close();
                        sr.Close();
    
    
    
                        MemoryStream mmstream = new MemoryStream(ImgByte);
                        imgZheng = Image.FromStream(mmstream);
                        mmstream.Close();
    //此时再执行Save方法,将不会报错
              MemoryStream mstream = new MemoryStream();
                    imgZheng.Save(mstream, ImageFormat.Png);
  • 相关阅读:
    Java基础之集合框架(Collection接口和List接口)
    Management
    .NET实现多个不同有效时间Session方案思考
    C#操作MySql数据库帮助类(Dapper,T-Sql)
    MVC控制器传递多个实体类集合到视图的方案总结
    高德js API根据出行方式和出现策略由起始点经纬度实现路线规划
    c#QQ邮件编程学习(收发邮件)
    自定义tt文本模板实现MySql指数据库中生成实体类
    Socket客户端
    Socket服务端
  • 原文地址:https://www.cnblogs.com/chiyueqi/p/3225794.html
Copyright © 2011-2022 走看看