今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html)。顿时感觉好久没有在这个blog上写东西了。想当年刚毕业没事情干的时候,还是写得很不亦乐乎的。所以决定炒炒冷饭,写一篇技术文章,以说明我还没有忘记这里。

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容易出错的地方。

  1. 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,很容易你就会遇到这个问题。 此种情况是因为图片被占用导致锁定,保存前使用 Graphics.DrawImage() 复制一份,然后dispose释放掉锁定就ok了~

参考文献:

[1]. Microsoft Security Bulletin MS04-028 Buffer Overrun in JPEG Processing (GDI+) Could Allow Code Execution (833987) http://www.microsoft.com/technet/security/bulletin/MS04-028.mspx

[2].Microsoft Security Bulletin MS08-052 – Critical Vulnerabilities in GDI+ Could Allow Remote Code Execution (954593)http://www.microsoft.com/technet/security/bulletin/MS08-052.mspx

C# .NET开发图形图像程序时提示“GDI+ 中发生一般性错误“相关推荐

  1. C#界面设计--5--Bitmap.save保存图片时: GDI+ 中发生一般性错误 解决办法

    Bitmap.save保存图片时: GDI+ 中发生一般性错误 解决办法 源程序: var date = DateTime.Now.ToString("yyyy-MM-dd");/ ...

  2. FileUpload上传图片提示 “GDI+中发生一般性错误”

    上传图片后需要压缩图片,看了半天没有问题,后来仔细一看原来是压缩的新路径多了一级导致错误 小小的错误.希望可以帮助遇到同样问题的朋友们! 转载于:https://www.cnblogs.com/jia ...

  3. GDI+ 中发生一般性错误(在 OutputStream 中保存 PNG 格式图像时遇到的问题)

    在将图片以 PNG 格式保存至 Response.OutputStream 时,会碰到如下错误: GDI+ 中发生一般性错误. 原因: 在写 PNG 格式的图像时,指针需要在存储的位置来回移动.而 R ...

  4. GDI+ 中发生一般性错误(生成验证码时出现的错误)

    我在生成验证码时,出现这样的错误:GDI+ 中发生一般性错误. 怎么解决? 转载于:https://www.cnblogs.com/happyangle/archive/2008/06/11/1217 ...

  5. 图像对象paip.Image对象出现“对象当前正在其他地方使用或者GDI+中发生一般性错误的解决...

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ paip.Image对象现出"对象以后正在其他地方用使或者GDI+中产生一般性误错的决解 作者Attilax ,   ...

  6. matlab win32错误,尝试运行Matlab-Compiler-Runtime应用程序时Windows 7中出现SxS错误

    我正在尝试运行作为Windows 7计算机上的独立Matlab应用程序构建的数据分析工具. 我已经安装了Matlab编译器运行时(MCR)库7.11,2009b. 当我尝试启动应用程序ELISAgui ...

  7. Matlab GUI学习02:使用GUIDE开发图形界面程序

    pdf版本笔记的下载地址: Matlab GUI学习02_使用GUIDE开发图形界面程序(访问密码:3834) Matlab GUI学习02:使用GUIDE开发图形界面程序 GUIDE GUIDE简介 ...

  8. android app启动图片 加动画效果,Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案...

    Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案 大家在设计APP的末期,都会想给APP搞一些"花里胡哨"的特效来提高APP的B格.博主表示亲测有效 ...

  9. 计算机卸载一个程序正确操作,电脑卸载程序时提示请等待当前程序完成卸载或更改怎么办...

    摘要 腾兴网为您分享:电脑卸载程序时提示请等待当前程序完成卸载或更改怎么办,中国体育,政务易,粤听,游戏堂等软件知识,以及输入法2012,人人代拍,长截屏软件,1322游戏盒,庆国庆迎中秋手抄报,远征 ...

  10. TIA博途下载PLC程序时提示“具有激活的TIS功能防止下载到设备”错误-处理办法

    TIA博途下载PLC程序时提示"具有激活的TIS功能防止下载到设备"错误-处理办法 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站 ...

最新文章

  1. int、bigint、smallint 和 tinyint
  2. Zabbix 中文乱码解决
  3. python进制转换函数汇总-攻防世界-Misc-掀桌子;
  4. svn怎么看未提交修改了哪些文件_Git与SVN的区别
  5. 数学学习笔记-三角函数
  6. Spark-shell 脚本批量执行命令,命令行批量执行命令
  7. 华为云携手马栏山文创园助力湖南广电荣获国家广电总局多项大奖
  8. K2评分方法理解实例
  9. Java 字符串使用之性能优化实践
  10. ubuntu 设置静态路由_ubuntu 配置静态路由
  11. oracle+omf+格式,Oracle OMF管理数据文件
  12. day75,爬虫02,webmagic入门程序,组件介绍:Downloader,PageProcess,pipeline,Scheduler,51jop招聘网站综合案例
  13. JavaScript的入门(下)
  14. java 输出反斜杠_Java 反斜杠如何转义的问题
  15. 致读者:冰河技术微信公众号的重大调整!!
  16. win7计算机磁盘清理,win7电脑清理磁盘的操作过程
  17. 太极英语笔记-前传语法-代词
  18. idea打包出错时出现 Cleaning up unclosed ZipFile for archive?
  19. 低功耗深度休眠后无法唤醒、烧录程序,怎么办?(华大半导体HC32L136)
  20. 编程段子│只有程序猿才能看懂的搞笑段子

热门文章

  1. Hdu 1026 Ignatius and the Princess I
  2. hdu 1061 Rightmost Digit解题报告
  3. HDOJ HDU 1023 1130 1133 1134 2067 ACM 1023 1130 1133 1134 2067 IN HDU ( 卡特兰数 专题 catalan )...
  4. Unix环境高级编程(十九)终端I/O
  5. category is in invalid format hint微信第三方平台将第三方提交的代码包提交审核出错...
  6. GNOME 3.20 两大新特性说明
  7. 线程池作用及Executors方法讲解
  8. DOM---documentFragment
  9. 正则表达式学习笔记系列----1
  10. phpcmsv9 更换域名出现页面无法访问后怎么办