2024年4月26日发(作者:)

VC++图像处理模板

我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、

位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、

GIF、JPEG等)。因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或

代码。 现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在

图像方面的缺憾一去不复返了。

CImage类概述

CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像

文件加以显示,而且这些文件格式可以 相互转换。由于CImage在不同的Windows操作系统中其某些性

能是不一样的,因此在使用时要特别注意。例如,CImage::PlgBlt和 CImage::MaskBlt只能在 Windows

NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。CImage::AlphaBlend和

CImage::TransparentBlt也只能在 Windows 2000/98或其更高版本中使用。即使在Windows 2000运

行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。

CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素。它具有下列最酷特性:

1、AlphaBlend支持像素级的颜色混合,从而实现透明和半透明的效果。

2、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中,而且还可能使用位屏蔽操作。

3、TransparentBlt在目标区域中产生透明图像,SetTransparentColor用来设置某种颜色是透明色。

4、MaskBlt在目标区域中产生源位图与屏蔽位图合成的效果。

使用CImage的一般方法

使用CImage的一般方法是这样的过程:

(1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:

#include <atlimage.h>

(2) 定义一个CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。

(3) 调用CImage::Draw方法绘制图像。Draw方法具有如下定义:

程序代码:

BOOL Draw( HDC hDestDC, int xDest, int yDest,

int nDestWidth, int nDestHeight, int xSrc, int ySrc,

int nSrcWidth, int nSrcHeight );

BOOL Draw( HDC hDestDC, const RECT& rectDest, const RECT& rectSrc );

BOOL Draw( HDC hDestDC, int xDest, int yDest );

BOOL Draw( HDC hDestDC, const POINT& pointDest );

BOOL Draw( HDC hDestDC, int xDest, int yDest,

int nDestWidth, int nDestHeight );

BOOL Draw( HDC hDestDC, const RECT& rectDest );

其中,hDestDC用来指定绘制的目标设备环境句柄,(xDest, yDest)和pointDest用来指定图像显示的

位置,这个位置和源图像的左上角点相对应。nDestWidth和nDestHeight分别指定图 像要显示的高度和

宽度,xSrc、ySrc、nSrcWidth和nSrcHeight用来指定要显示的源图像的某个部分所在的位置和大小。

rectDest和rectSrc分别用来指定目标设备环境上和源图像所要显示的某个部分的位置和大小。

需要说明的是,Draw方法综合了StretchBlt、TransparentBlt和AlphaBlend函数的功能。默认时,Draw

的功能和 StretchBlt相同。但当图像含有透明色或Alpha通道时,它的功能又和TransparentBlt、AlphaBlend

相同。因此,在一般 情况下,我们都应该尽量调用CImage::Draw方法来绘制图像。

例如,下面的示例Ex_Image是实现这样的功能:当选择"文件"ò"打开"菜单命令后,弹出一个文件打开对

话框。当选定一个图像文件后,就会在窗口客户区中显示该图像文件内容。这个示例的具体步骤如下:

(1) 创建一个默认的单文档程序项目Ex_Image。

(2) 打开stdafx.h文件中添加CImage类的包含文件atlimage.h。

(3) 在view类中添加成员变量CImage m_Image;

CEx_ImageView类添加ID_FILE_OPEN的COMMAND事件映射程序,并添加下列代码:

程序代码:

void CImageProcessView::OnFileOpen()

{

// TODO: 在此添加命令处理程序代码

CString strFilter;

CSimpleArray aguidFileTypes;

HRESULT hResult;

// 获取CImage支持的图像文件的过滤字符串

hResult = m_orterFilterString(strFilter,aguidFileTypes,

_T( "All Image Files") );

if (FAILED(hResult)) {

MessageBox(_T("GetExporterFilter调用失败!"));

return;

}

CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);

if(IDOK != l())

return;

m_y();

// 将外部图像文件装载到CImage对象中

hResult = m_(hName());//许多教程上都写错了 都写的是GetFileName()

if (FAILED(hResult)) {