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

本文深入探讨了使用StretchDIBits函数生成镜像图像时,Ysrc和nSrcHeight参数对镜像位置的影响。通过实例分析,解释了参数符号变化如何导致图像在X轴或Y轴上的镜像效果,并强调了Ysrc值对镜像显示完整性的关键作用。此外,文章还介绍了当nDestHeight为负时,镜像图像的绘制流程与区别,提供了生成镜像图像的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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生成镜像图像的一些总结

 

转载于:https://www.cnblogs.com/mr-totoro/archive/2013/04/10/5785677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值