GDI+一般性错误(A generic error occurred in GDI+)

1.GDI+的前世今生

GDI+全称图形设备接口,Graphics Device Interface (GDI) ,他的爸爸叫做GDI, 用C写的。Windows XP出来以后用C++重新写了一下,变成了GDI+。从.NET Framework 1.0开始,GDI+就被正式封装在了.NET Framework里面,并被广泛地应用到了所有和图形图像相关的程序中。不幸的是,这个GDI+引入了微软有史以来最大的2个patch,造成了Microsoft IT, Support, Developer, Tester的无数麻烦。[1][2]

GDI+没有用显卡加速,所以Windows Vista推荐用Windows Display Driver Model (WDDM)了,支持渲染,3D加速。不过普通的应用程序,用GDI/GDI+其实是完全足够了,所以GDI+是在微软平台上开发图形图像程序的最好选择了。至少现在没有听说微软准备重新写GDI。

GDI+ 可以用来做图形处理,也可以做图像处理。这里只分析几个使用.NET Framework容易出错的地方。

2. GDI+一般性错误(A generic error occurred in GDI+)

这是使用GDI+的时候最滑稽的一个Exception,里面啥信息都没有。对于刚刚开始使用.NET Framework开发者来说,很难发现这个问题到底是为什么。

我们先来看看下面一段代码

string fileName = "sample.jpg";
Bitmap bmp = new Bitmap(fileName);
bmp.Save(fileName, ImageFormat.Jpeg);

这段代码的目的是要打开一个Bitmap,然后保存。可惜这段代码一定会给你一个GDI+一般性错误:

System.Runtime.InteropServices.ExternalException

其中的Error Code是0x80004005, innerException是空。如果你查Windows的Error Code表,会发现这个错误原因是“Unspecified Error”,还是什么都不知道。这其实是.NET Framework封装不好的问题,我们可以调用

Marshal.GetLastWin32Error()

拿到Win32的Error, 32。这个错误代码就有点信息量了,在winerror.h里面,我们可以找到下面的定义:

//
// MessageId: ERROR_SHARING_VIOLATION
//
// MessageText:
//
//  The process cannot access the file because it is being used by another process.
//
#define ERROR_SHARING_VIOLATION          32L

原来是文件不能写。其实MSDN里面有一句话,The file remains locked until the Bitmap is disposed。所以文件读取以后是锁着的,没有办法写。那如果我想做点改动然后再保存原来的文件怎么办呢?

这里有个土办法可以搞定这个问题

Bitmap bmpTemp = new Bitmap(image);
Bitmap bmp = new Bitmap(bmpTemp);
bmpTemp.Dispose();
bmp.Save(image, ImageFormat.Jpeg);

只要把当前的图像复制一份,然后把旧的Dispose掉,那个文件就不被锁住了,这样就可以放心覆盖原始文件了。

想想如果你要用GDI+写一个Painter,很容易你就会遇到这个问题。

时间: 2024-10-10 07:04:37

GDI+一般性错误(A generic error occurred in GDI+)的相关文章

A generic error occurred in GDI+的解决方案

转自智慧光原文A generic error occurred in GDI+. 解决方法 使用image1.RotateFlip(RotateFlipType.Rotate90FlipNone)方法时候,出现错误: An unhandled exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll Additional information: A ge

A generic error occurred in GDI+. 上传图片报错

代码就不说了,因为本地测试 ok, 服务端 就不行 ,服务器 环境 阿里云 win2008 r2  64 位 原因 是我没有这是 文件加权限 : 左边 的 少了 权限~ 代码 :含义是 网络图片 裁剪 保存 到本地 ,本地 再 存储 到 七牛 云存储. public static string Crop(string ImgUrl, int Width, int Height, int X, int Y) { string path = "C:\\DescripttionImg\\";

日积月累:配置SDK路径错误(An error occurred while automatically activating bundle com.android.ide.eclipse.adt)

在进行Android应用的开发过程中,有时候在配置SDK路径的时候(Windows->Preferences->Android),会出现如下报错:An error occurred while automatically activating bundle com.android.ide.eclipse.adt.并且重启Eclipse也没用.  注:该图为正常情况. 搜索相关资料,找到如下处理办法: 命令行到eclipse路径: 运行:eclipse.exe -clean: 日积月累:配置SD

ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法

偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.Clear();Response.ContentType = "image/PNG";img.Save(Response.OutputStream, ChartFormat.Png);竟然出现异常,是GDI+一般性错误.但是如果格式是Response.ContentType = "

iis7错误提示An error occurred on the server when processing the URL...

win7下面运行ASP程序总是出错,原来是站点配置的问题... 问题一:MS Jet引擎改变了临时目录的位置,但是又没有对临时目录的存取权限,导致数据库使用失败(因为sql问题,后改用access数据库测试). 解决办法: 给“系统盘:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp”目录添加一个“Authenticated Users”的用户,其中AppData目录是隐藏的,在进入的时候可以直接在地址栏输入路径,或者在文件夹选

eclipse启动错误:An internal error occurred during: "Initializing Java Tooling". java.lang.NullPointerException

eclipse启动错误:An internal error occurred during: "Initializing Java Tooling". java.lang.NullPointerException 解决方法一:重置eclipse界面视图 记以备查! 原文地址:https://www.cnblogs.com/lin-nest/p/9261483.html

Eclipse启动时出现错误 An internal error occurred during: “Updating indexes”

在Eclipse的workspace下有个.metadata文件夹,Eclipse出现异常的log文件就在这个目录下. 最近出现了这样的错误: 查看日志文件发现:     !ENTRY org.eclipse.core.jobs 4 2 2011-08-03 09:33:32.843     !MESSAGE An internal error occurred during: "Updating indexes".     !STACK 0     java.lang.OutOfMe

Eclipse启动时出现错误 An internal error occurred during: "Updating indexes"

在Eclipse的workspace下有个.metadata文件夹,Eclipse出现异常的log文件就在这个目录下. 最近出现了这样的错误: 查看日志文件发现:     !ENTRY org.eclipse.core.jobs 4 2 2011-08-03 09:33:32.843     !MESSAGE An internal error occurred during: "Updating indexes".     !STACK 0     Java.lang.OutOfMe

随着时间的推移:构造SDK路径错误(An error occurred while automatically activating bundle com.android.ide.eclipse.adt)

在进行Android应用的开发过程中,有时候在配置SDK路径的时候(Windows->Preferences->Android).会出现例如以下报错:An error occurred while automatically activating bundle com.android.ide.eclipse.adt. 而且重新启动Eclipse也没用.  注:该图为正常情况. 搜索相关资料,找到例如以下处理办法: 命令行到eclipse路径. 执行:eclipse.exe -clean: 版权