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);
  • 相关阅读:
    kubernetes 网络故障遇见的坑
    CentOS7 Rsync服务搭建-Rsync+Inotify架构实现实时同步
    centos 7 git的管理和使用
    阿里云 ECS 监控报警设置
    ECS centos7 使用外部邮件服务商的465加密端口
    阿里云ECS 固定带宽变为按量付费的方式
    centos6 和centos7 安装git 的区别
    nginx 新增域名访问
    if 判断文件
    前端基础进阶(一):内存空间详细图解
  • 原文地址:https://www.cnblogs.com/chiyueqi/p/3225794.html
Copyright © 2011-2022 走看看