GDI+一般性错误(A generic error occurred in GDI+)
2015-06-23 09:45
405 查看
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,很容易你就会遇到这个问题。
相关文章推荐
- 软件定义网络、网络虚拟化和网络功能虚拟化的区别
- 违反AppStore第2.23条(数据被iCloud备份而被拒)
- Mysql MERGE引擎简介
- linaro官网地址 linaro交叉编译工具
- Apache Shiro介绍
- Android工具包
- 冲刺8
- 浏览器拦截跨域请求处理方法(已阻止跨源请求:同源策略禁止读取远程资源)
- 课程改进意见
- ubuntu12.04 安装CS:APP Y86模拟器
- Redis list 类型学习笔记与总结
- 【MyBatis框架】订单商品数据模型-分析思路
- JVM工作原理学习笔记
- cordova开发入门<一>
- Powershell 批量替换文件
- 第二阶段第十天站立会议总结
- 9patch边框黑线的含义
- Autolayout下使用代码改变frame无效
- fmt标签的格式化日期使用
- Java中Map基本认识