首页 > 代码库 > (转)理解Bitblt、StretchBlt与SetDIBitsToDevice、StretchDibits

(转)理解Bitblt、StretchBlt与SetDIBitsToDevice、StretchDibits

http://blog.csdn.net/hczhiyue/article/details/6264115

BitBlt和StretchBlt是CDC类位图操作函数,用于DDB的位图操作。

BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop)

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)

 

  hdcDest:指向目标设备环境的句柄。
  nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
  nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
  nWidth:指定源和目标矩形区域的逻辑宽度。
  nHeight:指定源和目标矩形区域的逻辑高度。
  hdcSrc:指向源设备环境的句柄。
  nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
  nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
  nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。
  nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。

nXDest nYDest nXSrc nYSrc指定为逻辑坐标系下的起点。在DC与内存DC中,DC与内存DC的逻辑坐标系可以不同,即SetWindowExt与SetWindowOrg的参数可以不一样,如果完全一样则可以用BitBlt,如果不一样,最好将坐标轴的方向设置一致,可以用StretchBlt,如果方向不一致,出来的图像就可能是上下或左右颠倒的。

  dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
  下面列出了一些常见的光栅操作代码:
  BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
  DSTINVERT:表示使目标矩形区域颜色取反。
  MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
  MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
  NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
  NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
  PATCOPY:将特定的模式拷贝到目标位图上。
  PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
  PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
  SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
  SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
  SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
  SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
  SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
  WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。

 

SetDIBitsToDevice和StretchDIBits是Windows支持的DIB访问函数(API)

int SetDIBitsToDevice(HDC hdc, int xDest, int Ydest, DWORD dwWidth, DWORD dwHeight, intXSrc, int Ysrc, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits, CONST BITMAPINFO *lpbmi, UINT fuColorUse)

  hdc:设备环境句柄。
  XDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。
  YDest:指字目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
  dwWidth:指定DIB的宽度,按逻辑单位表示宽度。
  dwHeight:指定DIB的高度,按逻辑单位表示高度。
  XSrc:指定DIB位图左下角的X轴坐标(不管biHeight为正或负),按逻辑单位表示坐标。
  YSrc:指定DIB位图左下角的Y轴坐标(不管biHeight为正或负),按逻辑单位表示坐标。
  uScanLines:指定DIB中的起始扫描线。
  cScanLInes:指定参数lpvBits指向的数组中包含的DIB扫描线数目。
  lpvBits:指向存储DIB颜色数据的字节类型数组的指针。为了减少对大型DIB位图的位进行设置所需的内存量,应用程序可以通过重复调用SetDIBitsToBevice。每次将位图的不同部分放入到lpvBits数组来将输出捆绑在一起。参数uStartScan和cScanLines的值标明了lpvBits数组中包含的位图部分。
  lpbmi:指向BITMAPINFO结构的指针,该结构包含有关DIB的信息。
  fuColorUse:指向BITMAPINFO结构中的成员bmiColors是否包含明确的RGB值或对调色板进行索引的值。
  参数fuColorUse必须是下列值之一,这些值的含义如下:
  DIB_PAL_COLORS:表示颜色表由16位的索引值数组组成,利用这些值可对当前选中的逻辑调色板进行索引。
  DIB_RGB_COLORS:表示颜色表包含原义的RGB值。
  返回值:如果函数执行成功,那么返回值是设置的扫描线数目;如果函数失败,那么返回值为0。

 

int StretchDIBits(HDC hdc, int XDest , int YDest , int nDestWidth, int nDestHeight, int XSrc, int Ysrc, int nSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO * lpBitsInfo, UINT iUsage, DWORD dwRop)

 

  hdc:指向目标设备环境的句柄。
  XDest:指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。
  YDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
  nDestWidth:指定目标矩形的宽度。为正时绘制区域在XDest的右边,绘制方向从左到右;为负时向绘制区域在XDest的左边,绘制方向从右到左。
  nDestHeight:指定目标矩形的高度。为正时绘制区域在YDest的下方,但是绘制方向从下到上;为负时绘制区域在YDest的上方,但是绘制方向从上到下

  XSrc:指定DIB中源矩形(左下角)的X轴坐标(不管biHeight为正或负),坐标以像素点表示。 

  YSrc:指定DIB中源矩形(左下角)的Y轴坐标(不管biHeight为正或负),坐标以像素点表示。

  nSrcWidth:按像素点指定DIB中源矩形的宽度,为正时选择区域在XSrc的右边,扫描方向从左到右;为负时选择区域在XSrc的左边,扫描方向从右到左。
  nSrcHeight:按像素点指定DIB中源矩形的高度,为正时选择区域在YSrc的上方,扫描方向从下到上;为负时选择区域在YSrc的下方,扫描方向从上到下。

  先扫描行,后扫描列。
  lpBits:指向DIB位的指针,这些位的值按字节类型数组存储。
  lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。
  iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了,那么该bmiColors是否包含了明确的RGB值或索引。参数iUsage必须取下列值,这些值的含义如下:
  DIB_PAL_COLOR:表示该数组包含对源设备环境的逻辑调色板进行索引的16位索引值。
  DIB_RGB_COLORS:表示该颜色表包含原义的KGB值,若想了解更多的信息,请参考下面备注一节。
  dwRop:指定源像素点、目标设备环境的当前刷子和目标像素点是如何组合形成新的图像。

  返回值:如果函数执行成功,那么返回值是拷贝的扫描线数目,如果函数执行失败,那么返回值是GDI_ERROR。