[转载]关于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,  0,0,  256,256, 0,0, 256,256,PIX1,bif,DIB_RGB_COLORS,SRCCOPY),可以画出原图。起初我想用下列的表达式

StretchDIBits(*pDC, 0,0, 256,256, 0,0,256,-256,PIX1,bif,DIB_RGB_COLORS,SRCCOPY),(注意我改的是nSrcHeight成为负数)可是这样得出的图像只是一条直线。后来自己看了看别人写的代码,原来是自己的那个源设备的y轴偏移量需要改变。我发现,镜像之后的图像文件只是一条直线,原来自己的Ysrc需要进行改变。因为关于x轴对称,镜像位图相对于源图像是向上镜像。如下图示意:

[转载]关于StretchDIBits生成镜像图像的一些总结

所以说当你Ysrc设置比较低的时候,镜像之后的图像只有部分图像在图像范围(由目标设备决定的,Xdest,Ydest)内,其余已经超出了这个Xdest、Ydest确定的目标设备的绘图边界。一般,要使得镜像图像完全显示出来,必须是的Ysrc大于等于nSrcHeight。但是当Ysrc大于nSrcHeight时,其镜像之后的文件会向下偏离Xdest、Ydest确定的目标设备的绘图边界(Ysrc-nSrcHeight)。当我改变nDstHeight的符号成负数时,情况又有所不一样,如

StretchDIBits(*pDC, 0,512, 256,-256,0,0,256,256,PIX1,bif,DIB_RGB_COLORS,SRCCOPY)。这种情况下,相当于先将源位图绘制在以(0,512)为左上角的图像框中,再对绘制的位图进行向上镜像。

所以说,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)。

[转载]关于StretchDIBits生成镜像图像的一些总结

 

posted on 2013-04-10 11:31  龙猫先生  阅读(633)  评论(0编辑  收藏  举报

导航