[转载]关于StretchDIBits生成镜像图像的一些总结
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);
利用StretchDIBits函数或者StretchBlt函数生成位图图像的镜像时,很多时候大家都只是单纯的记住了,“如果nSrcWidth和nDestWidth参数的符号不同。或是nSrcHeight和nDesHeight参数的符号不同。那么函数StretchDIBits将创建位图的镜像。如果NsrcWidth和NdestWidth符号不同,那么函数将沿着X轴创建位图镜像。如果NsrcHeight和NdestHeight符号不同,那么函数将沿着Y轴创建位图镜像。”不过在实际操作中,还是要注意一些问题(今天偶然发现的)。StretchDIBits(*pDC,
StretchDIBits(*pDC,
所以说当你Ysrc设置比较低的时候,镜像之后的图像只有部分图像在图像范围(由目标设备决定的,Xdest,Ydest)内,其余已经超出了这个Xdest、Ydest确定的目标设备的绘图边界。一般,要使得镜像图像完全显示出来,必须是的Ysrc大于等于nSrcHeight。但是当Ysrc大于nSrcHeight时,其镜像之后的文件会向下偏离Xdest、Ydest确定的目标设备的绘图边界(Ysrc-nSrcHeight)。当我改变nDstHeight的符号成负数时,情况又有所不一样,如
StretchDIBits(*pDC,
所以说,nDestHeight如果为负,nSrcHeight为正,则就是将源位图绘制完之后的图像进行镜像,如果nSrcHeight为负,nDestHeight如果为负的话,则是先将源位图进行关于x轴的向上镜像,再绘制到目标位图的相框中。当两个参数同时为负的时候,此时,则是先将源位图关于x轴的向上镜像,绘制到目标位图区域之后再进行目标位图关于x轴的向上镜像,得到最终的图像。
同理,关于y轴的镜像,也遵循同样的规律。nDestWidth如果为负,nSrcWidth为正,则就是将源位图绘制完之后的图像进行镜像,如果nSrcWidth为负,nDestWidth如果为负的话,则是先将源位图进行关于Y轴的向左镜像,再绘制到目标位图的相框中。当两个参数同时为负的时候,此时,则是先将源位图关于Y轴的向左镜像,绘制到目标位图区域之后再进行目标位图关于Y轴的向左镜像,得到最终的图像。当你Xsrc设置比较低的时候,镜像之后的图像只有部分图像在图像范围(由目标设备决定的,Xdest,Ydest)内,其余已经超出了这个Xdest、Ydest确定的目标设备的绘图边界。一般,要使得镜像图像完全显示出来,必须是的Xsrc大于等于nSrcWidth。但是当Xsrc大于nSrcWidth时,其镜像之后的文件会向下偏离Xdest、Ydest确定的目标设备的绘图边界(Xsrc-nSrcWidth)。