BitBlt和StretchBlt的区别

来源:互联网 发布:网络药品销售 编辑:程序博客网 时间:2024/05/17 18:18

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           所有输出变白。 

说明:
从源设备上下文拷贝位图到这个当前设备上下文。
应用可以在字节边界上对齐窗口或客户区域,保证BitBlt操作发生在以字节对齐的矩形上(登记窗口类时设置设备CS_BYTEALLGNWINDOWCS_BYTEALIGHCLIENT标记)。
在字节对齐矩形上的BitBlt操作比未经字节对齐的矩形上的BitBlt操作快许多。如果想对自己的设备上下文指定字节对齐类风格,必须登记窗口类而不要依赖Microsoft基本类。可使用全局函数AfxRegisterWndClass
一旦使用目标设备上下文和使用源设备上下文,GDI变形nWidthnHeight。如果结果延伸不匹配,必要时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源设备中的位图移动到目标矩形,该矩形用成员函数正在调用的设备上下文来表示。xSrcySrcnSrcWidthnSrcHeight 参数定义了源矩形的左上角和尺寸。xycnWidthnHeight参数定义了目标矩形的左上角和尺寸。dwRop指定的光栅操作模式说明了源位图与目标设备上已经存在的位图是如何组合的。如果nSrcWidthnWidthnSrcHeightnHeight的符号不同,StretchBlt将为位图创建一个镜像。如果nSrcWidthnWidth符号不同,函数沿X轴创建镜像。如果nSrcHeightnHeight符号不同,函数沿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映射到目标dcnXOriginDest, nYOriginDest。源dc的范围和目标dc的范围执行拉伸隐射。可以看成一个空间几何的四棱椎台体。从一个截面映射到另外一个截面。如果2个截面面积相等,那就是11的数据拷贝,如果不是,就按照比例计算拟合数据。
这个需要 SetStretchBltMode 设置拉伸拷贝的数据复合模式。也就是数据拟合的计算方法。
相同的参数 DWORD dwRop 表示光栅计算模式,从源数据-》目标数据的复合,比如拷贝、按位与或等二进制运算。简单说,bitblt直接按你指定的大小输出源dc到目标dc,而strechblt会调整你源dc大小,使之适应你所指定的目标dc大小,再输出。也就是说,strechblt输出的图总是完整的,而且充满你指定的目标DC区域,而bitblt则可能输出的图是不完整的,也可能无法充满目标dc制定区域