在Visual C++中若想处理图片,可以使用CBitmap 类或静态图片控件。但它们处理只能处理BMP格式的图片、图标、光标以及图元文件等;使用起来非常受限,因此我们一般只是在做程序界面时使用。而CImage可以处理JPGE、GIF、BMP、PNG等多种格式图片,包括格式转换、裁切、复制、拼接等许多应用方法。CImage类表面上看像是MFC的封装类,其实它是MFC和ATL共享的新类,它也可以在非MFC环境下使用。本文就CImage的主要成员函数Load、Draw、Save的使用方法做一简单介绍。
一、介绍内容
CImage类对象通过调用其成员函数Load从磁盘中载入诸如JPEG、GIF、BMP和PNG格式的图片文件进行处理,再调用Draw函数将图片文件绘制到另外一个CImage类对象中(包括复制、缩放等),最后通过Save函数可以保存图片文件,也可以利用Save相互转换图片文件的格式。
二、使用CImage类Load、Create、Draw、Save几个函数的一般步骤:
<1>包含头文件:
#include<atlimage.h> //在C++空项目中需要包含这个头文件,而在高版本MFC不需如此即可使用CImage
<2>声明一个CImage类对象,然后调用其成员函数Load加载一个图片文件。
CImage srcImage; //原图像
srcImage.Load("路径\\文件名.jpeg");
<3>再声明一个CImage对象,然后调用Create函数生成一个空白的图像(实际是全黑)。
CImage destImage;//目标图像
destImage.Create(destWidth,destHeight,bpp); //前两个参数的单位是像素,bpp是位深度,jpeg的位深度是24
说明:如果不使用Create函数,而是仍然使用Load函数,则可以将两幅图片组合到一起,变化还有很多,可以试验。
<4>调用成员函数Draw绘制图像,亦即把原图像中的全部或部分内容复制到目标图像中。
BOOL Draw (HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight);
//a. 调用Draw函数的是原图像对象,即srcImage.Draw( ... ... ),不要弄混淆
//b. HDC hDestDC是目标图像对象的设备上下文指针,可以通过destImage.GetDC()获得,注意指针使用完毕要用destImage.ReleaseDC()语句将指针释放,否则,再次获取指针时会报错。
//c. xDest与yDest,目标图像中拟粘贴区域的左上角坐标(单位:像素)
//d. nDestWidth与DestHeight,目标图像中拟粘贴区域的宽、高
//e. xSrc与ySrc,源图像中拟复制域左上角坐标
//h. nSrcWidth与nSrcHeight,原图像中拟复制区域宽、高
说明:从函数的参数表可以看出,原图像复制区域与目标图像的粘贴区域大小可以不同,亦即可以通过Draw函数对图像进行缩放;但大小不同时,可能会发生图像颜色失真现象,为解决这一问题,可以在调用Draw函数前,增加一条语句:SetStretchBltMode(destImage.GetDC(), COLORONCOLOR); 注意这里是对目标图像对象进行设置,不要弄反。
<5>调用Save函数将目标图像保存到文件中
destImage.Save("路径\\文件名.jpeg"); //这里,如把文件后缀改变,则可以改变文件格式(当然前面提到的位深度bpp要改变)
CImage类的成员函数还有很多,这里介绍的只是常用的几个。