一、基础知识1.BitBlt
BitBlt用于将位图从原始设备复制到目标设备,语法如下:
BOOL BitBlt (
HDC hdcDest,//handle to destination DC
int nXDest,//目标矩形区域左上角的x轴坐标点。
int nYDest,//目标矩形区域左上角的y轴坐标点。
在int nWidth,//目标设备上绘制位图的宽度。
在int nHeight,//目标设备上绘制位图的高度。
HDC hdcSrc,//源设备上下文对象指针。
int nXSrc,//源设备上下文的起点x轴坐标。 函数从这个起点将位图复制到目标设备。
int nYSrc,//源设备上下文起点的y轴坐标。 函数从这个起点将位图复制到目标设备。
DWORD dwRop //光栅操作代码
);
dwRop有以下选择:
BLACKNESS用黑色填充目标区域
DSTINVERT目标矩阵区域的颜色反转
MERGECOPY将原始设备的矩形区域颜色和目标设备的画笔与运算结合使用
MERGEPAINT使用或运算将反转的源矩形区域的颜色与目标矩形区域的颜色合并
将NOTSRCCOPY复制源设备区域的颜色反转到目标设备
NOTSRCERASE通过组合和计算源设备区域和目标设备区域的颜色来反转结果的颜色
PATCOPY将源设备上当前选定的画笔复制到目标设备
PATINVERT使用异或运算将目标设备上选定的画笔与目标设备区域的颜色组合起来
PATPAINT通过或运算组合目标区域中当前选定的画笔和源设备区域的反转颜色
SRCAND将源设备和目标设备区域的颜色与运算结合使用
SRCCOPY将源设备区域直接复制到目标设备
SRCERASE将目标设备区域的相反颜色和源设备区域的颜色与运算结合使用
SRCINVERT使用异或运算将源设备区域的颜色与目标设备区域的颜色组合起来
SRCPAINT使用或计算源设备区域的颜色和目标设备区域的颜色进行组合
WHITENESS用白色填充目标区域
2.StretchDIBits
int StretchDIBits (
HDC hdc,//handle to DC
int XDest,//指定目标矩形左上角的x轴坐标,以逻辑单位表示坐标。
int YDest,//指定目标矩形左上角的y轴坐标,以逻辑单位表示坐标。
int nDestWidth,//指定目标矩形的宽度,以逻辑为单位表示宽度。
int nDestHeight,//指定目标矩形的高度,以逻辑单位表示高度。
int XSrc,//指源矩形区域左上角的x轴坐标,以逻辑单位表示坐标。
int YSrc,//指源矩形区域左上角的y轴坐标,以逻辑单位表示坐标。
int nSrcWidth,//指定源矩形的宽度,以逻辑为单位表示宽度。
int nSrcHeight,//指定源矩形区域左上角的y轴坐标,以逻辑单位表示坐标。
指向CONST VOID *lpBits,//dib位的指针。 这些位的值以字节型数组存储
指向包含CONST BITMAPINFO *lpBitsInfo,//dib相关信息的BITMAPINFO结构的指针。
UINT iUsage,//指示是否提供作为BITMAPINFO结构成员的bmiColors,如果提供,则指示该bmiColors是否包含明确的RGB值或索引。
DWORD dwRop //光栅操作代码
);
BITMAPINFO结构的形状如下。
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGB四足动物颜色[1];
(} BITMAPINFO;
其中bmiHeader.biHeight表示图像的高度,但也可以是负值。 例如,如果图像大小为512*512
如果bmiHeader.biHeight=512,则图像的原点位于左下角。
bmiHeader.biHeight=-512表示图像原点位于左上角;
通常,将bmiHeader.biHeight设置为负值很有用,因为图像处理中使用的坐标系坐标的原点通常位于图像的左上角。
(本说明引用博客http://blog.csdn.net/BF long/article/details/47298997 )
3.区别
StretchBlt是拉伸图像的副本。 参数多于bitblt。 这是一种映射模式,从源dc的nXOriginSrc、nYOrignSrc映射到目标dc的nXOriginDest、nYOriginDest。 源直流的范围和目标直流的范围执行
行拉伸隐射。可以看成一个空间几何的四棱椎台体。从一个截面映射到另外一个截面。如果2个截面面积相等,那就是1对1的数据拷贝,如果不是,就按照比例计算拟合数据。这个需要 SetStretchBltMode 设置拉伸拷贝的数据复合模式。也就是数据拟合的计算方法。
相同的参数 DWORD dwRop 表示光栅计算模式,从源数据-》目标数据的复合,比如拷贝、按位与或等二进制运算。
简单说,bitblt直接按你指定的大小输出源dc到目标dc,而strechblt会调整你源dc大小,使之适应你所指定的目标dc大小,再输出。
也就是说,strechblt输出的图总是完整的,而且充满你指定的目标DC区域,而bitblt则可能输出的图是不完整的,也可能无法充满目标dc制定区域。
4.其他
CImage类是ATL和MFC共用的一个类,其头文件为atlimage.h,主要用于图片文件的打开,显示与保存。
CImage::Create
创建以CImage位图并将它附加到以前构造的CImage对象。
Bool Create(int nWidth, int nHeight, int nBPP, DWORD dwFlags = 0);
参数:
nWidth:CImage 位图的宽度,以像素为单位。
nHeight:CImage 位图的高度,均以像素。 如果 nHeight 为正数的,位图是一个从下到上DIB,并且原点是左下角。 如果 nHeight 为负,位图是一组DIB,并且原点为左上角。
nBPP:位的数目每在位图的像素。 通常4,8,16,24或32。 可以是1单色位图或掩码。
dwFlags:指定位图对象是否具有一个alpha通道。
CImage::Save
用于将图像保存到指定的流或文件在磁盘上。
HRESULT Save(IStream* pStream, REFGUID guidFileType ) const throw();
HRESULT Save( LPCTSTR pszFileName, REFGUID guidFileType= GUID_NULL) const throw();
参数:
pStream
对包含文件图像数据的IStream COM对象的指针。
pszFileName
对文件名的指针的图像。
guidFileType
保存图像的文件类型。 可以是如下内容之一:
ImageFormatBMP 一个未压缩的位图图像。
ImageFormatPNG 可移植网络映像(PNG)压缩图像。
ImageFormatJPEG JPEG压缩图像。
ImageFormatGIF GIF压缩图像。
CImage::ReleaseDC
释放设备上下文。
设备中的需求功能包括截取图像;在图像上进行绘图操作,并截取带绘图的图像等功能。
简单的截取图像就可以使用函数BitBlt完成,并保存到本地。
对于需要截取带绘图的图像时,可以使用StretchDIBits函数进行操作,设置PBITMAPINFO结构体参数等。
CImage *pImage = new CImage;//创建一个CImage对象的指针
pImage->Create(512, 512, 32, 0);//创建以CImage位图并将它附加到以前构造的CImage对象。
CDC* m_pMemDC;//Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。MFC基 础类库定义了设备环境对象类—-CDC类。
BYTE* m_pImg;
if()
{
BitBlt(pImage->GetDC(), 0, 0, 512,512, m_pMemDC->m_hDC, 0, 0, SRCCOPY);
}
else
{
StretchDIBits(pImage->GetDC(), 0, 0, 512, 512, 0, 0, 512, 512, m_pImg, (PBITMAPINFO)&m_cImgBmpInfo, DIB_RGB_COLORS, SRCCOPY);
}
pImage->Save(strFolderPath);//用于将图像保存到指定的流或文件在磁盘上。
pImage->ReleaseDC();//释放设备上下文。
delete pImage;//析构对象