1,360 views
首页 > 技术心得 > 能用于 VC6 的 CImage 类

能用于 VC6 的 CImage 类

2009年1月8日

对于图像操作,在遥远的计算机蛮荒时代,我们一般使用 CBitmap 类,这个类在 MFC 和 WTL 上均有实现。至于 DIB 格式的图像,以及文件存盘的操作,CBitmap 类就无能为力了。我们只能求助于自己来实现或者用别人实现的类了。

时代总是进步的,到 VC7 以后了,ATL 框架内增加了一个 CImage 类,基本上完成了上述的述求。但顽固如我等人,却一定要在 VC6 的圈子里混(因为编译出来的可执行文件不用带一大堆什么.Net框架,什么带manifest的古怪东东,又是什么神秘的特定版本的运行时DLL等等,我只想我的简单程序能顺畅的运行在所有的 Windows 平台上,如此而已),就开始倒行逆施的改造了 CImage 类了,改造如下。

这个类用到了 CString 类,这就必须要 WTL 才能工作,当然 MFC 框架应该也能。
还用到了 GDIplus,因此您最好还要下载能支持 VC6 的最后版本的 Platform SDK,且将 VC6 打上 SP6 补丁才能用。

一些资源的下载地址:

下面是使用注意事项:
在您的工程的 stdafx.h 文件的顶打头, 定义一个宏

#define __VC6_ATL_IMAGE_H__ 1

在 stdafx.h 的靠近下部包含这个文件

#include <ATLIMAGE.H>

在 stdafx.cpp 文件的末尾加上这么几句

#if _MSC_VER < 1300
CImage::CInitGDIPlus CImage::s_initGDIPlus;
CImage::CDCCache CImage::s_cache;
#endif

然后, 我们改工程的属性:
菜单项 “project” -> “settings” 蹦出 “Project settings” 对话框 “C/C++” -> “Category:” -> “Procompiled headers”
选中 “Not using precompiled headers” 单选按钮, 不使用预编译头.
(这里顺便一说, 建议同学们以后的工程都不使用预编译头, 这项 M$ 提供的特性给您造成的麻烦比给你的好处要多的多的多的多的多).

到这时, 就可以使用 CImage 类了啦, 比如说从磁盘文件装入图像, 保存图像文件, DIB 操作, 等等.

以下内容就是更改后的 atlimage.h 文件
atlimage.h

例子程序
vvvvvv

free2000fly 技术心得 , ,

  1. 小李
    2010年8月16日11:48 | #1

    请问 stdafx.h是怎么来的,另外请问是否只有使用 你改过的atlimage.h就可以使用CImage啦?还是说在自己的.cpp文件还要做什么特殊的处理?小弟愚笨,还请赐教!

  2. 小李
    2010年8月16日14:57 | #2

    使用时老报错:please define __VC6_ATL_IMAGE_H__ flag in stdafx.h file’s begin and following…
    可是我都已经按照你说的配置啦stdafx.h啊,请问究竟是什么原因,谢谢!

  3. 2010年8月18日11:37 | #3

    @小李
    你够矬的, 上传了个例子程序, 自己看看吧. 别说你还不懂哟.

  1. 目前还没有任何 trackbacks 和 pingbacks.