zoukankan      html  css  js  c++  java
  • image.Save GDI+中发生一般性错误的解决办法

    image.Save 出现异常 GDI+中发生一般性错误的解决办法,发生异常错误代码如下:

    private byte[] GetBytes(Image image)
    {
                try
                {
                    if (image == null) return null;               
                    using (MemoryStream stream = new MemoryStream())
                    {
                            image.Save(stream, ImageFormat.Jpeg);
                            return stream.GetBuffer();
                    }
                    
                }
                finally
                {
                    if (image != null)
                    {
                        image.Dispose();
                        image = null;
                    }
                }
    }

     修改后无异常,代码如下:

    private byte[] GetBytes(Image image)
    {
                try
                {
                    if (image == null) return null;
                    using (Bitmap bitmap = new Bitmap(image))
                    {
                        using (MemoryStream stream = new MemoryStream())
                        {
                            bitmap.Save(stream, ImageFormat.Jpeg);
                            return stream.GetBuffer();
                        }
                    }
                }
                finally
                {
                    if (image != null)
                    {
                        image.Dispose();
                        image = null;
                    }
                }
    }

    MSDN 解释如下:

    Bitmap 对象或一个 图像 对象从一个文件, 构造时该文件仍保留锁定对于对象的生存期。 因此, 无法更改图像并将其保存回它产生相同的文件。

    替代方法
    •    创建非索引映像。
    •    创建索引映像。
    这两种情况下, 原始 位图 上调用 Bitmap.Dispose() 方法删除该文件上锁或删除要求, 流或内存保持活动

    创建非索引图像
    即使原始映像被索引格式中该方法要求新图像位于每像素 (超过 8 位 -) -, 非索引像素格式。 此变通方法使用 Graphics.DrawImage() 方法来将映像复制到新 位图 对象:
    1.    构造从流、 从内存, 或从文件原始 位图 。
    2.    创建新 位图 的相同大小, 带有是超过 8 位 - - 像素 (BPP) 每像素格式。
    3.    使用 Graphics.FromImage() 方法以获取有关二 位图 Graphics 对象。
    4.    用于 Graphics.DrawImage() 绘制首 位图 到二 位图 。
    5.    用于 Graphics.Dispose() 处置是 图形 。
    6.    用于 Bitmap.Dispose() 是首 位图 处置。

    创建索引映像
    此解决办法在索引格式创建一个 Bitmap 对象:
    1.    构造从流、 从内存, 或从文件原始 位图 。
    2.    创建新 位图 具有相同的大小和像素格式作为首 位图 。
    3.    使用 Bitmap.LockBits() 方法来锁定整个图像对于两 Bitmap 对象以其本机像素格式。
    4.    使用 Marshal.Copy 函数或其他内存复制函数来从首 位图 复制到二 位图 图像位。
    5.    使用 Bitmap.UnlockBits() 方法可以解锁两 Bitmap 对象。
    6.    用于 Bitmap.Dispose() 是首 位图 处置。

    创建非索引图像,例如:

    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
                    //创建一个bitmap类型的bmp变量来读取文件。
                    Bitmap bmp = new Bitmap(openFileDialog1 .FileName );
                    //新建第二个bitmap类型的bmp2变量,我这里是根据我的程序需要设置的。
                    Bitmap bmp2 = new Bitmap(1024, 768, PixelFormat.Format16bppRgb555);
                    //将第一个bmp拷贝到bmp2中
                    Graphics draw = Graphics.FromImage(bmp2);
                    draw.DrawImage(bmp,0,0);
                    pictureBox1.Image = (Image)bmp2 ;//读取bmp2到picturebox
                    FILE = openFileDialog1.FileName;
                    openFileDialog1.Dispose();
                    draw.Dispose();
                    bmp.Dispose();//释放bmp文件资源
    }

    如果是在Web 程序中注意这些设置:

    1. 相应的帐户没有写权限。
    解决方法:赋予 NETWORK SERVICE 帐户以写权限。
    2. 指定的物理路径不存在。
    解决方法:
    在调用 Save 方法之前,先判断目录是否存在,若不存在,则创建。
    if (!Directory.Exists(dirpath))
    Directory.CreateDirectory(dirpath);

  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/douf/p/15433328.html
Copyright © 2011-2022 走看看