您当前位置: 圣才学习网首页 >> IT类 >> .NET程序设计

GDI+高频问题思考(1)

扫码手机阅读
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
评论(0
   
来源:网络 作者:未知
 
  1.GDI+的前世今生
 
  GDI+全称图形设备接口,Graphics Device Interface GDI,他的爸爸叫做GDIC的。Windows XP出来以后用C++重新写了一下,变成了GDI+。从.NET Framework 1.0开始, GDI+就被正式封装在了.NET Framework里面,并被广泛地应用到了所有和图形图像相关的程序中。不幸的是,这个GDI+引入了微软有史以来最大的2patch,造成了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 BitmapfileName);
 
  bmp.SavefileName ImageFormat.Jpeg);
 
  这段代码的目的是要打开一个Bitmap,然后保存。可惜这段代码一定会给你一个GDI+一般性错误:
 
  System.Runtime.InteropServices.ExternalException
 
  其中的Error Code0x80004005 innerException是空。如果你查WindowsError Code 表,会发现这个错误原因是“Unspecified Error”,还是什么都不知道。这其实是.NET Framework封装不好的问题,我们可以调用
 
  Marshal.GetLastWin32Error()
 
  拿到Win32Error 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 Bitmapimage);
 
  Bitmap bmp new BitmapbmpTemp);
 
  bmpTemp.Dispose();
 
  bmp.Saveimage ImageFormat.Jpeg);
 
  只要把当前的图像复制一份,然后把旧的Dispose掉,那个文件就不被锁住了,这样就可以放心覆盖原始文件了。
 
  想想如果你要用GDI+写一个Painter,很容易你就会遇到这个问题。
 
相关阅读
 
 

小编工资已与此挂钩!一一分钱!求打赏↓ ↓ ↓

如果你喜欢本文章,请赐赏:

已赐赏的人
最新评论(共0条)评论一句