`
cloudtech
  • 浏览: 4613341 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用GDI+进行开发的一些问题(2)

 
阅读更多

问题2,System.OutOfMemoryException

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

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

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

前一段我们还是使用了在问题1中介绍的读图像文件的方法,之后我们使用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下面的多个类都不符合这本书写的内容。

那么这个问题到底是为什么呢?我们再用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的有效性在函数的第一行就可以直接判断出来了,根本不需要到实际处理的时候才抛内存不足的异常。这个封装写得的确不怎么样。


[*] .NET设计规范:.NET约定惯用法与模式,http://www.amazon.cn/mn/detailApp?qid=1224568025&ref=SR&sr=13-2&uid=168-7715813-6370648&prodid=zjbk366428

分享到:
评论

相关推荐

    GDI+开发包 GDI+ SDK

    GDI+开发包,解压文件,并将其中的Includes和Lib中的文件复制到VS安装目录中VC98目录下的Includes和Lib文件夹中

    GDI+开发包 GDI+安装详解

    Visual C++6.0使用GDI+的一般方法 1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 或者 将Visual...

    gdi+ 帮助文档

    对于初学者,还有一个问题就是,如果想要进行GDI+开发, 需要下载一个GDI+的开发包(SDK). 网上搜到的一般只包含一个DLL,没法用. 在我另外一个资源中提供了一个详细的SDK,包含了进行开发所需要的全部内容:头文件,库文件...

    GDI+开发库

    GDI+开发库

    GDI+图像程序设计(PDF & 源码 -电子工业出版社)

     本书从介绍GDI+Windows图形程序设计的基本知识开始,其核心是对一些实际问题的指导,包括如何使用Windows Forms及如何优化GDI+的性能。本书通过一些例子来说明如何开发真实世界的工具,如GDI+Painter、GDI+Editro...

    GDI+库以及使用方法

    1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 4. 程序中添加GDI+的包含文件gdiplus.h以及附加的类库...

    GDI+开发包

    包含GDI+开发所必需的开发包,并且包括配置使用方法,

    VC下如何使用GDI+进行

    因为GDI+对GDI的很多性能进行了优化,同时还提供了其他的一些特性。 一个图形设备接口,例如GDI+, 允许应用程序开发人员在打印机或屏幕上显示信息,而不用去考虑显示设备的具体细节。应用程序开发人员调用GDI+ ...

    C#GDI+图形程序设计源码

    第2章 第一个GDI+ 应用程序 2.1 绘制表面 2.2 坐标系统 2.3 指南——第一个GDI+ 应用程序 2.4 一些基本的GDI+ 对象 总结 第3章 Graphics类 3.1 Graphics类的属性 3.2 Graphics类的方法 3.3 GDI+ Painter...

    使用vc和gdi+开发图形界面

    使用VC6和GDI+开发图形界面.首先在VC6加载GDI+动态库,然后根据自己的要求建立控件,在控件中使用GDI+绘图.使用GDI+比使用GDI思路更清晰,界面更美观.

    GDI+库文件

    顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,...

    GDI+ PDF.rar

    顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,...

    GDI+ SDK参考(翻译版本)_gdi+_源码

    GDI+SDK开发手册 翻译版本,GDI+详细开发说明

    GDI+ 开发SDK

    GDI+的开发组件,包括了所有的头文件,动态链接库文件和lib文件

    VB6 GDI+入门教程(最新版)

    GDI+是GDI的延生,应用于WinXP及更新版的Windows系统。...现有的很多介绍GDI+的资料不少,但几乎都是基于.Net的,而介绍用VB6开发GDI+的资料却少之又少,偏偏又不少人需要用VB6来开发GDI+程序。所以这个资料不可多得。

    GDI+开发资料

    GDI+开发资料 类库及说明文档

    GDI+油量表开发

    GDI+油量表开发

    VC中使用GDI+库,实现图片旋转

    基于VC++语言,VS平台开发,应用GDI+库,双缓冲,实现图片旋转,屏幕不闪烁。代码量不大,简单易学。

Global site tag (gtag.js) - Google Analytics