GDI+中发生一般性错误的解决办法(转载)

今天在开发.net引用程序中,需要System.Drawing.Image.Save
创建图片,debug的时候程序一切正常,可是发布到IIS后缺提示出现“GDI+中发生一般性错误”的异常。
于是开始“摆渡”,并寻找到了解决办法:赋予
NETWORK SERVICE 帐户以写权限。

以下为晚上寻找到的资料:

在开发.NET应用中,使用 System.Drawing.Image.Save 方法而导致“GDI+
中发生一般性错误”的发生,通常有以下三种原因:
1. 相应的帐户没有写权限。
解决方法:赋予 NETWORK SERVICE
帐户以写权限。
2. 指定的物理路径不存在。
解决方法:
在调用 Save 方法之前,先判断目录是否存在,若不存在,则创建。
if
(!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);
3.
保存的文件已存在并因某种原因被锁定。
解决方法:
重启IIS,解除锁定。并在代码中使用 using 语句,确保释放 Image
对象所使用的所有资源。

我遇到的情况:
     
在编写Chem.NET的时候要保存图片,我先用openFileDialog打开图片文件,然后用saveFileDialog保存文件时就出现了
GDI+中发生一般性错误”,我当时就想到是打开的文件还没有释放出来,于是用openFileDialog1.Dispose()来释放,可是没有成功。同样从一个MemorySream
实例打开一个Image后,立即关闭了这个流,结果在Image.Save时也会发生这种错误。我“摆渡”了很久都是遇到和我一样问题的人,CSDN上面的同志也没有给出一个实用的答案。最后终于还是在微软的网站上找到了答案:(以下是官方解决办法)
症状
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() 是首 位图
处置。
由于外国人的思维和我们不一样,我重新用实例解释一下,我这里使用的是创建非索引图像。
private void
ToolStripMenuItem_Click(object sender, EventArgs
e)
       
{
            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文件资源
           
}
       
}
通过以上的读取文件,在保存的时候就不会出现错误了

转载来自: http://hi.baidu.com/yangczcz/item/fbac82f4ba7a9bd342c36aa6

GDI+中发生一般性错误的解决办法(转载),布布扣,bubuko.com

时间: 2024-10-08 21:46:27

GDI+中发生一般性错误的解决办法(转载)的相关文章

“GDI+ 中发生一般性错误” 解决方法

System.Runtime.InteropServices.ExternalException: GDI+ 中发生一般性错误 相应的帐户没有写权限,赋予帐户写入权限

[转]GDI+ 中发生一般性错误

在开发.NET应用中,使用 System.Drawing.Image.Save 方法而导致“GDI+ 中发生一般性错误”的发生,通常有以下三种原因:1. 相应的帐户没有写权限.解决方法:赋予 NETWORK SERVICE 帐户以写权限.2. 指定的物理路径不存在.解决方法:在调用 Save 方法之前,先判断目录是否存在,若不存在,则创建.if (!Directory.Exists(dirpath))Directory.CreateDirectory(dirpath);3. 保存的文件已存在并因

[转载]GDI+中发生一般性错误

注:第一次写博客,把自己遇到的问题和收集的资料记录在博客上.在开发.NET应用中,使用 System.Drawing.Image.Save 方法而导致"GDI+ 中发生一般性错误"的发生,通常有以下三种原因:1. 相应的帐户没有写权限.解决方法:赋予 NETWORK SERVICE 帐户以写权限.2. 指定的物理路径不存在.解决方法:在调用 Save 方法之前,先判断目录是否存在,若不存在,则创建.if (!Directory.Exists(dirpath))Directory.Cre

一、GDI+中发生一般性错误——C#踩坑记

处理图片的时候发生 GDI+中发生一般性错误 我知道的原因有4个 1. 相应的帐户没有写权限. 解决方法:增加权限,赋予 NETWORK SERVICE 帐户以写权限. 2. 指定的物理路径不存在.解决方法:在调用 Save 方法之前,先判断目录是否存在,若不存在,则创建. 网络中应该使用虚拟路径,记得加“~/” if (!Directory.Exists(dirpath))Directory.CreateDirectory(dirpath); 3. 保存的文件已存在并因某种原因被锁定.解决方法

Image.Save()发生“GDI+ 中发生一般性错误”

从数据库中读取的图片是byte[]类型,将其转换成Image可以正常显示,但是调用image.Save()时会发生“GDI+ 中发生一般性错误”.public static System.Drawing.Image ToImage(byte[]bytes){    System.IO.Stream ms = new System.IO.MemoryStream(bytes);    System.Drawing.Image image =System.Drawing.Image.FromStre

GDI+ 中发生一般性错误。

“/wechat”应用程序中的服务器错误. GDI+ 中发生一般性错误. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Runtime.InteropServices.ExternalException: GDI+ 中发生一般性错误. 源错误: 行 37: } 行 38: string savePath = string.Format("{0}/storebook.png"

GDI+中发生一般性错误之文件被占用

有多种原因可能导致这个异常出现,比如创建文件的权限不足.文件被占用等. 这里提供一个使用Stream读取图片避免文件被占用的方法. public Image GetImageFromStream(string fileName) { Image img = null; try { FileStream fs = File.OpenRead(fileName); img = Image.FromStream(fs); fs.Close(); } catch (IOException ie) { M

生成缩略图时报GDI+中发生一般性错误

最近由于业务需要要写一个生成缩略图并能设置图片质量的功能,本来这是一件so easy的事,以前也干过,可是却遇到了问题.话不多说先看代码 /// <summary> /// 等比生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理

图片在保存的时候===》出现这个异常:GDI+ 中发生一般性错误

异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 一般这种情况都是没有权限,比如目录没有创建就写入,或者没有写入文件的权限 我的是目录问题,更多解决方案请看下面的参考 参考: http://bbs.csdn.net/topics/340250830 http://www.cnblogs.com/lgzslf/archive/2009/03/16/1412878.html