MFC bitbit 函数

bitblt 和stretchblt的区别
 
先来简述下两者的区别:
BitBlt将一个图像大小尺寸原封不动的贴到目标位置上,即在贴图的过程中图像的大小尺寸不会改变!但是源图像可与目标位图进行指定的光栅操作。
StretchBlt将一个图像贴到目标位置上,但在贴图的过程中可对图像的大小尺寸进行缩小或放大!亦可进行光栅操作。
但是在使用StretchBlt对图像进行缩小时需要特别注意图像失真的问题(别以为失真时放大特有的属性哦,缩小时也会有“失真”!),这时在对图像进行缩小之前只需设置一下Mode即可,例如:
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0, 0,  bmp2.bmWidth/2, 


   bmp2.bmHeight/2, 
                       &memdc2, 
                       0,0, 
                 bmp2.bmWidth,bmp2.bmHeight, 
                       SRCCOPY);


关于SetStretchBltMode函数的使用详见:《SetSTretchBltMode解决图像缩放失真》
 
CDC::BitBlt
BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );


返回值:函数成功,返回非零值,否则为0。
参数: 
x 指定目标矩形左上角的逻辑x坐标。  
y 指定目标矩形左上角的逻辑y坐标。  
nWidth 指定目标矩形和源位图的宽度(逻辑单位)。  
nHeight 指定目标矩形和源位图的高度(逻辑单位)。  
pSrcDC 指向CDC对象的指针,标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅操作,则它必须为NULL。  
xSrc 指定源位图左上角的逻辑X坐标。  
ySrc 指定源位图左上角的逻辑Y坐标。  
dwRop 指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。
下面对dwRop列出光栅操作代码及其描述:
BLACKNESS 所有输出变黑。  
DSTINVERT 反转目标位图。  
MERGECOPY 使用布尔AND操作符合并特征与源位图。  
MERGEPAINT 使用布尔OR操作符合并特征与源位图。  
NOTSRCCOPY 拷贝反转源位图到目标。  
NOTSRCERASE 反转使用布尔OR操作符合并源和目标位图的结果。  
PATCOPY 拷贝特征到目标位图。  
PATINVERT 使用布尔XOR操作符合并目标位图和特征。  
PATPAINT 使用布尔OR操作符合并反转源位图和特征。用布尔OR操作符合并这项操作结果与目标位图。  
SRCAND 使用布尔AND操作符合并目标像素和源位图。  
SRCCOPY 拷贝源位图到目标位图。  
SRCERASE 反转目标位图并用布尔AND操作符合并这个结果和源位图。  
SRCINVERT 使用布尔XOR操作符合并目标像素和源位图。  
SRCPAINT 使用布尔OR操作符合并目标像素和源位图。  
WHITENESS 所有输出变白。  
有关光栅操作代码的完整列表,请参阅联机文档“Win32 SDK程序员参考”附录节中的“关于光栅操作代码”。  


说明:
从源设备上下文拷贝位图到这个当前设备上下文。
应用可以在字节边界上对齐窗口或客户区域,保证BitBlt操作发生在以字节对齐的矩形上(登记窗口类时设置设备CS_BYTEALLGNWINDOW或CS_BYTEALIGHCLIENT标记)。
在字节对齐矩形上的BitBlt操作比未经字节对齐的矩形上的BitBlt操作快许多。如果想对自己的设备上下文指定字节对齐类风格,必须登记窗口类而不要依赖Microsoft基本类。可使用全局函数AfxRegisterWndClass。
一旦使用目标设备上下文和使用源设备上下文,GDI变形nWidth和nHeight。如果结果延伸不匹配,必要时GDI使用Windows StretchBlt函数压缩或拉伸源位图。
如果目标、源和特征位图颜色格式不同,BitBlt转换源和特征位图以匹配目标。转换中使用目标位图的前景和背景色。
BitBlt函数把单色位图转换为彩色时,它设置白色(1)为背景色,黑色(0)作为前景色。使用目标设备上下文的背景和前景色。要把彩色转换为单色,BitBlt把与背景色匹配的像素设置为白色,其余所有像素设置为黑色。在从彩色到单色的转换中,BitBlt使用彩色设备上下文的前景和背景色。
注意,并非所有的设备上下文都支持BitBlt。为检查给定设备上下文是否支持BitBlt,使用GetDeviceCaps成员函数并指定RASTERCAPS索引。


CDC::StretchBlt
BOOL StretchBlt(
     int x,
     int y,
     int nWidth,
     int nHeight,
     CDC* pSrcDC,
     intxSrc,
     int ySrc,
     int nSrcWidth,
     int nSrcHeight,
     DWORD dwRop
     )


返回值:如果位图已经绘制,则返回非零值,否则为0。
参数: 
x 目标矩形左上角的X逻辑坐标。  
y 目标矩形左上角的Y逻辑坐标。  
nWidth 目标矩形的宽度(逻辑单位)。  
nHeight 目标矩形的高度(逻辑单位)。  
pSrcDC 指定源设备上下文。  
xSrc 源矩形左上角的X逻辑坐标。  
ySrc 源矩形左上角的Y逻辑坐标。  
nSrcWidth 源矩形的宽度(逻辑单位)。  
nSrcHeight 源矩形的高度(逻辑单位)。  
dwRop 指定光栅操作。光栅操作模式说明了GDI是如何组合输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。可以为下列值之一: · BLACKNESS 将所有输出变为黑色。  
· DSTINBERT 反转目标位图颜色。  
· MERGECOPY 使用AND运算符组合模板与源位图的颜色。  
· MERGEPAINT 使用OR运算符组合源位图的反色与目标矩形的颜色。  
· NOTSRCCOPY 将源位图的反色拷贝到目标矩形中。  
· NOTSRCERASE 反转使用OR运算符组合源位图与目标矩形后得到的颜色。  
· PATCOPY 将模板颜色拷贝到目标矩形中。  
· PATINVERT 使用XOR运算符组合目标矩形与模板颜色。  
· PATPAINT 使用OR运算符组合模板与源位图的反色。再使用OR运算符将该操作结果与目标矩形组合。  
· SRCAND 使用AND运算符组合源位图和目标位图的像素。  
· SRCCOPY 将源位图拷贝到目标位图。  
· SRCERASE 反转目标矩形的颜色,再使用AND运算符将该结果与源位图组合。  
· SRCINVERT 使用XOR运算符组合源位图和目标位图的像素。  
· SRCPAINT 使用OR运算符组合源位图和目标位图的像素。  
· WHITENESS 使所有输出变成白色。  


说明:
将源矩形中的位图拷贝到目标矩形中,如果有必要,可以扩展或压缩该位图使其与目标矩形尺寸吻合。函数使用目标设备上下文(由SetStretchBltMode设置)的扩展模式来决定如何扩展或压缩位图。StretchBlt函数将pSrcDC源设备中的位图移动到目标矩形,该矩形用成员函数正在调用的设备上下文来表示。xSrc,ySrc,nSrcWidth和nSrcHeight 参数定义了源矩形的左上角和尺寸。x,yc,nWidth和nHeight参数定义了目标矩形的左上角和尺寸。dwRop指定的光栅操作模式说明了源位图与目标设备上已经存在的位图是如何组合的。如果nSrcWidth和nWidth或nSrcHeight和nHeight的符号不同,StretchBlt将为位图创建一个镜像。如果nSrcWidth和nWidth符号不同,函数沿X轴创建镜像。如果nSrcHeight和nHeight符号不同,函数沿Y轴创建镜像。StretchBlt函数在内存中对源位图进行扩展或压缩,然后将结果拷贝到目标矩形中。如果模板要与结果组合,则在扩展后的位图拷贝到目标矩形后才组合。如果用到画刷,应使用目标设备上下文中选定的画刷。目标坐标根据目标设备上下文来转换,源坐标根据源设备上下文来转换。如果目标位图、源位图和模板位图的格式不一致,StretchBlt使模板与源位图匹配模板位图格式,转换中会使用到目标设备上下文中的前景色和背景色。如果要将黑白位图转换为彩色位图,它将背景色设置为白位(1),前景色设置为黑位(0)。如果要将彩色位图转换为黑白位图,函数设置与背景色匹配的像素为白(1),其它像素为黑(0),用到了带颜色的设备上下文中的前景色和背景色。不是所有的设备都支持StretchBlt函数。调用带RASTERCAPS索引的GetDeviceCaps 函数来决定是否支持StretchBlt。并检验为返回给RC_STRETCHBLT标记的值。
 
BitBlt 是位块传送,
BitBlt( HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,   HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);


从源dc的 nXSrc,nYSrc坐标开始,拷贝图像数据到目的dc的 nXDest,nYDest 坐标处,拷贝宽度和长度是 nWidth, nHeight;,如果原dc的范围达不到nWidth,nHeight的范围,那部分数据不处理。


StretchBlt是拉伸图像拷贝。参数中比bitblt多了, nWidthSrc, nHeightSrc,源dc的高度和宽度。这个是映射模式,从源dc的,nXOriginSrc,nYOrignSrc映射到目标dc的nXOriginDest, nYOriginDest。源dc的范围和目标dc的范围执行拉伸隐射。可以看成一个空间几何的四棱椎台体。从一个截面映射到另外一个截面。如果2个截面面积相等,那就是1对1的数据拷贝,如果不是,就按照比例计算拟合数据。
这个需要 SetStretchBltMode 设置拉伸拷贝的数据复合模式。也就是数据拟合的计算方法。


相同的参数 DWORD dwRop 表示光栅计算模式,从源数据-》目标数据的复合,比如拷贝、按位与或等二进制运算。
简单说,bitblt直接按你指定的大小输出源dc到目标dc,而strechblt会调整你源dc大小,使之适应你所指定的目标dc大小,再输出。也就是说,strechblt输出的图总是完整的,而且充满你指定的目标DC区域,而bitblt则可能输出的图是不完整的,也可能无法充满目标dc制定区域

猜你喜欢

转载自blog.csdn.net/syb198810/article/details/80713408
今日推荐