当前位置:主页   - 电脑 - 网站开发 - ASP.Net
GDI+中常见的几个问题(2)
来源:网络   作者:   更新时间:2012-05-13
收藏此页】    【字号    】    【打印】    【关闭

  3. System.OutOfMemoryException

  首先我们还是来看一段代码

Bitmap bmpTemp = new Bitmap(image);
Bitmap bmp = new Bitmap(bmpTemp);
bmpTemp.Dispose();

Bitmap bmp2 = bmp.Clone(new Rectangle(1, 1, bmp.Width, bmp.Height), PixelFormat.Format24bppRgb);

  前一段我们还是使用了在第2节中介绍的读图像文件的方法,之后我们使用Bitmap.Clone()方法复制一份拷贝。其实这是除了new Bitamp()之外的另一种复制图像的方法。这个方法强大的地方是它可以复制图像的一块区域。不幸的是上面那句话会给你一个System.OutOfMemoryException。这个Exception索性连ErrorCode都不给你了,innerException还是空。Krzysztof Cwalina和Brad Abrams写过一本叫"Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries",不幸的是我们的System.Drawing下面的多个类都不符合这本书写的内容。说到这本书,中文版还是我一个同事翻译的,做一把广告。(http://www.amazon.cn/mn/detailApp?qid=1224568025&ref=SR&sr=13-2&uid=168-7715813-6370648&prodid=zjbk366428)

  那么这个问题到底是为什么呢?我们再用Marshal.GetLastWin32Error() 来看看错误所在。可惜这次不灵了,我们拿到了一个2的错误代码,在winerror.h里,它是

//
// MessageId: ERROR_FILE_NOT_FOUND
//
// MessageText:
//
//  The system cannot find the file specified.
//
#define ERROR_FILE_NOT_FOUND             2L

  完全没有什么关系。细心的读者可能已经发现了,我在Rectangle里面传递的参数是1,1,而不是0,0。这也就是说这个矩形已经超过了原始图像的大小。所以会报这个异常。但是是不是应该报OutOfMemory呢?让我们再看看MSDN.上面倒是说的很清楚,如果rect区域超出,报OutOfMemory,如果rect宽或者高是0,那么报ArgumentException. 为什么不统一成一个ArgumentException呢?很费解。 其实Rect的有效性在函数的第一行就可以直接判断出来了,根本不需要到实际处理的时候才抛内存不足的异常。这个封装写得的确不怎么样。

  系列文章:

  GDI+中常见的几个问题(1)

  GDI+中常见的几个问题(3)

  GDI+中常见的几个问题(4)

  GDI+中常见的几个问题(5)

  GDI+中常见的几个问题(6)

  GDI+中常见的几个问题(7)

  GDI+中常见的几个问题(8.外传1)

  GDI+中常见的几个问题(8)

  GDI+中常见的几个问题(9)

  GDI+中常见的几个问题(10)

  GDI+中常见的几个问题(11)

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明