首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

StretchDIBits,该如何处理

2012-05-28 
StretchDIBits我在用StretchDIBits函数将源位图拷贝到目标区时搞不懂了。不如:1.::StretchDIBits(pDC-GetS

StretchDIBits
我在用StretchDIBits函数将源位图拷贝到目标区时搞不懂了。不如:
1.
::StretchDIBits(pDC->GetSafeHdc(),
0,0,bitmapWidth,bitmapHeight,
0,0,bitmapWidth,bitmapHeight,
m_pImgData,pBitmapInfo,
DIB_RGB_COLORS,SRCCOPY);
实现了将源位图拷贝到目标区域。从代码看源位图和目标位图的坐标系都是一样的,都是以左上角作为坐标原点。
2.
for(int j=0;j<bitmapHeight;j++)//扫描特效显示的具体算法
{
::StretchDIBits(pDC->GetSafeHdc(),
0, j, bitmapWidth, 1,
0, bitmapHeight-j, bitmapWidth, 1,
m_pImgData, pBitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
Sleep(3);//设置延时时间
}
实现了扫描显示图片的功能。从代码看源位图的坐标系应该是坐下角。

这两段代码都运行正确。StretchDIBits函数在将源位图中的矩形区域的数据拷贝后显示在目标设备环境中的矩形中时,显示器的目标区域的坐标原点在右上角,请问源位图的坐标原点在什么地方?是不是我理解有错误?
请问各位大侠这是怎么回事?万分感谢!!

[解决办法]
int StretchDIBits(
HDC hdc, // handle to DC
int XDest, // x-coord of destination upper-left corner
int YDest, // y-coord of destination upper-left corner
int nDestWidth, // width of destination rectangle
int nDestHeight, // height of destination rectangle
int XSrc, // x-coord of source upper-left corner
int YSrc, // y-coord of source upper-left corner
int nSrcWidth, // width of source rectangle
int nSrcHeight, // height of source rectangle
CONST VOID *lpBits, // bitmap bits
CONST BITMAPINFO *lpBitsInfo, // bitmap data
UINT iUsage, // usage options
DWORD dwRop // raster operation code
);
[解决办法]
要看源图是什么类型的,源图的原点既可以在左上,又可以在左下。

引用The origin of a bottom-up DIB is the bottom-left corner; the origin of a top-down DIB is the upper-left corner.

[解决办法]
int StretchDIBits(
HDC hdc, // 指向目标设备环境的句柄。
int XDest, // 指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。
int YDest, // 指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标
int nDestWidth, // 指定目标矩形的宽度
int nDestHeight, // 指定目标矩形的高度
int XSrc, // 指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示
int YSrc, // 指定DIB中源矩形(左上角)的Y轴坐标,坐标以像素点表示
int nSrcWidth, // 按像素点指定DIB中源矩形的宽度
int nSrcHeight, // 按像素点指定DIB中源矩形的高度
CONST VOID *lpBits, // 指向DIB位的指针,这些位的值按字节类型数组存储
CONST BITMAPINFO *lpBitsInfo, // 指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息
UINT iUsage, // 表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了,那么该bmiColors是否包含了明确的RGB值或索引
DWORD dwRop // 指定源像素点、目标设备环境的当前刷子和目标像素点是如何组合形成新的图像
);

 参数iUsage必须取下列值,这些值的含义如下:
  DIB_PAL_COLOR:表示该数组包含对源设备环境的逻辑调色板进行索引的16位索引值。
  DIB_RGB_COLORS:表示该颜色表包含原义的KGB值,若想了解更多的信息,请参考下面备注一节。

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

[解决办法]
原点都是左上角,只不过DIB的图象数据是从最下面一行开始依次向上排列的。

热点排行