admin 管理员组文章数量: 1087674
2024年3月27日发(作者:同步fifo和异步fifo的总结)
实验二图象的几何变换参考资料
1 平移
平移(translation)变换是几何变换中最简单的一种。初始坐标为(x
0
,y
0
)的点经过平移(t
x
,t
y
)(以向
右,向下为正方向)后,坐标变为(x
1
,y
1
)。这两点之间的关系是x
1
=x
0
+t
x
,y
1
=y
0
+t
y
。
下面给出Translation的源代码。算法的思想是先将所有区域填成白色,然后找平移后显示
区域的左上角点(x
0
,y
0
) 和右下角点(x
1
,y
1
) ,分几种情况进行处理。
先看x方向(width指图象的宽度)
(1)
t
x
≤-width:很显然,图象完全移出了屏幕,不用做任何处理;
(2)
-width (3) 0< t x x 到width,对应原图的范围从0到width - t x ; (4) t x ≥width:图象完全移出了屏幕,不用做任何处理。 y方向是对应的(height表示图象的高度): (1) t y ≤-height,图象完全移出了屏幕,不用做任何处理; (2) -height y ≤0,图象区域的y范围从0到height-|t y |,对应原图的范围从|t y |到height; (3) 0 y y 到height,对应原图的范围从0到height-t y ; (4) t y ≥height,图象完全移出了屏幕,不用做任何处理。 这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用memcpy函数, 从(x 0 ,y 0 )点开始,一次可以拷贝一整行(宽度为x 1 -x 0 ),然后将内存指针移到(x 0 ,y 0 +1)处,拷 贝下一行。这样拷贝(y 1 -y 0 )行就完成了全部操作,避免了一个一个象素的计算,提高了效率。 Translation的源代码如下: int xOffset=0,yOffset=0; BOOL Translation(HWND hWnd) { DLGPROC dlgInputBox = NULL; DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; int SrcX0,SrcY0,SrcX1,SrcY1; int DstX0,DstY0,DstX1,DstY1; int RectWidth,RectHeight; BOOL xVisible,yVisible; HDC hDc; HFILE hf; int i; //出现对话框,输入x偏移量xOffset,和y偏移量yOffset dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox,ghInst ); DialogBox (ghInst, "INPUTBOX", hWnd, dlgInputBox); FreeProcInstance ( (FARPROC) dlgInputBox ); //OffBits为BITMAPINFOHEADER结构长度加调色板的大小 OffBits=its-sizeof(BITMAPFILEHEADER); BufSize=OffBits+ht*LineBytes;//要开的缓冲区的大小 //为新产生的位图分配缓冲区内存
版权声明:本文标题:c语言实现图像的旋转与平移 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1711543042a599153.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论