基于VC.NET的GDI+编程之CImage

我们知道,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) 在CEx_ImageView类添加ID_FILE_OPEN的COMMAND事件映射程序,并添加下列代码:

程序代码:

void CEx_ImageView::OnFileOpen()
{
  CString strFilter;
  CSimpleArray<GUID> aguidFileTypes;
  HRESULT hResult;

  // 获取CImage支持的图像文件的过滤字符串
  hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,
_T( "All Image Files") );
  if (FAILED(hResult)) {
   MessageBox("GetExporterFilter调用失败!");
   return;
  }
  CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
  if(IDOK != dlg.DoModal()) 
   return;

  m_Image.Destroy();
  // 将外部图像文件装载到CImage对象中
  hResult = m_Image.Load(dlg.GetFileName());
  if (FAILED(hResult)) {
   MessageBox("调用图像文件失败!");
   return;
  }

  // 设置主窗口标题栏内容
  CString str;
  str.LoadString(AFX_IDS_APP_TITLE);
  AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName());

  Invalidate(); // 强制调用OnDraw
}

(4) 定位到CEx_ImageView::OnDraw函数处,添加下列代码:

程序代码:

void CEx_ImageView::OnDraw(CDC* pDC)
{
  CEx_ImageDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  if (!m_Image.IsNull()) {
   m_Image.Draw(pDC->m_hDC,0,0);
  }
}

(5) 打开Ex_ImageView.h文件,添加一个公共的成员数据m_Image:

程序代码:

public:
CImage m_Image;

(6) 编译并运行。单击"打开"工具按钮,在弹出的对话框中指定一个图像文件后,单击"打开"按钮,其结果如图7.21所示。

时间: 2024-09-14 11:38:24

基于VC.NET的GDI+编程之CImage的相关文章

基于VC.NET的GDI+图像处理

我们知道,在以往的图像处理中,常常要根据不同图像文件的格式及其数据存储结构在不同格式中进行转换.某个图像文件的显示也是依靠对文件数据结构的剖析,然后读取相关图像数据而实现的.现在,GDI+提供了Image和Bitmap类使我们能轻松容易地处理图像. 概述 GDI+支持大多数流行的图像文件格式,如BMP.GIF.JPEG.TIFF和PNG等.下面先来介绍这些图像文件,然后再说明Image和Bitmap类支持的特性. 1.图像文件格式简介 图像文件是描绘一幅图像的计算机磁盘文件,其文件格式不下数十种

VC通用控件编程之CSlider控件

滑动条控制(Slider Control)也叫轨道条控制,其主要是用一个带有轨道和滑标的小窗口以及窗口上的刻度,来让用户选择一个离散数据或一个连续的数值区间.通过鼠标或键盘来进行数据的选择操作,这在WIN98/95中的很多应用程序中都可以看到,如控制面板中的鼠标等,滑动条既可以是水平方式的也可以是垂直方式的.滑动条控制的风格如下: TBS_HORZ 滑动条是水平方向的 TBS_VERT 滑动条是垂直方向的 TBS_LEFT 滑动条位于窗口左侧 TBS_RIGHT 滑动条位于窗口右侧 TBS_TO

VC通用控件编程之CImageList控件

图像列表控制(CImageList)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式.可以利用WINDOWS32位应用程序接口函数API来绘制.建立和删除图像,并能实现增加.删除.替换和拖动图像等操作.图像列表控制提供了控制图像列表的基本方法,这些方法在WINDOWS95及以后版本才能实现. (一)图像控制的对象结构 1.图像控制的数据成员 m_hImageList 连接图像对象的控制句柄 2.图像控制的建立方法 CimageL

vc-VC、Matlab混合编程之VC界面上显示Matlab窗口

问题描述 VC.Matlab混合编程之VC界面上显示Matlab窗口 各位大神,VC中如何获取隐藏窗口的句柄,FindWindow()为什么不行呢?还有VC和matlab混个编程中怎么样在VC中找到隐藏了的matlab窗口句柄?求赐教 解决方案 Matlab VC C++ 混合编程MATLAB与VC混合编程VC与Matlab混合编程

Node.js 异步编程之 Callback介绍(一)

 这篇文章主要介绍了Node.js 异步编程之 Callback介绍(一),本文用实例讲解Callback的相关知识,本文是第一篇,下一篇小编会跟进,需要的朋友可以参考下     Node.js 基于 JavaScript 引擎 v8,是单线程的.Node.js 采用了与通常 Web 上的 JavaScript 异步编程的方式来处理会造成阻塞的I/O操作.在 Node.js 中读取文件.访问数据库.网络请求等等都有可能是异步的.对于 Node.js 新人或者从其他语言背景迁移到 Node.js

Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)_Android

本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

android编程之XML文件解析方法详解(附源码)_Android

本文实例讲述了android编程之XML文件解析方法.分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8

Jennifer决定继续她的编程之旅

去年的4月1日,我开始了一个项目,这个项目改变了我的人生.听起来这像是陈词滥调,但是这是真的.去年的4月1日是我的180天180网站的第一天,当时我非常非常紧张.我不知道如何编写代码.我的电脑坏了,我只好用一个借来的笔记本电脑.我开始了这个疯狂的学习挑战,如果我失败了,每个人都能看到.我真是太疯狂了.我记得当时自己在想如果这个项目失败了,我可以声称它是一个煞费苦心的愚人节笑话.不过同时我也是非常非常兴奋.我终于开始学习创造我想做的东西了!我很久以前就想学习编写代码了,但是那些书籍和网上的教程看起

android编程之XML文件解析方法详解(附源码)

本文实例讲述了android编程之XML文件解析方法.分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8