欢迎来到天天文库
浏览记录
ID:12031873
大小:564.00 KB
页数:17页
时间:2018-07-15
《c语言实现图像的旋转与平移》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验二图象的几何变换参考资料1平移平移(translation)变换是几何变换中最简单的一种。初始坐标为(x,y)的点经过平移(t,t)(以向00xy右,向下为正方向)后,坐标变为(x,y)。这两点之间的关系是x=x+t,y=y+t。1110x10y下面给出Translation的源代码。算法的思想是先将所有区域填成白色,然后找平移后显示区域的左上角点(x,y)和右下角点(x,y),分几种情况进行处理。0011先看x方向(width指图象的宽度)(1)(2)tx≤-width:很显然,图象完全移出了屏幕,不用做任何处理;-width2、0:图象区域的x范围从0到width-3、tx4、,对应原图的范围从5、tx6、到width;(3)07、t8、,对应原图的范围从9、t10、到height;yyy011、对应原图的范围从0到height-t;yyyty≥height,图象完全移出了屏幕,不用做任何处理。这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用memcpy函数,从(x,y)点开始,一次可以拷贝一整行(宽度为x-x),然后将内存指针移到(x,y+1)处,拷001000贝下一行。这样拷贝(y-y)行就完成了全部操作,避免了一个一个象素的计算,提高了效率。10Translation的源代码如下:intxOffset=0,yOffset=0;BOOLTranslation(HWNDhWnd){ DLGPROCdlgInpu12、tBox=NULL;OffBits,BufSize;lpImgData;DWORDLPBITMAPINFOHEADERLPSTRlpPtr;HLOCALhTempImgData;lpTempImgData;lpTempPtr;LPBITMAPINFOHEADERLPSTRintSrcX0,SrcY0,SrcX1,SrcY1;DstX0,DstY0,DstX1,DstY1;RectWidth,RectHeight;xVisible,yVisible;hDc;intintBOOLHDCHFILEinthf;i;//出现对话框,输入x偏移量xOf13、fset,和y偏移量yOffsetdlgInputBox=(DLGPROC)MakeProcInstance((FARPROC)InputBox,ghInst);DialogBox(ghInst,"INPUTBOX",hWnd,dlgInputBox);FreeProcInstance((FARPROC)dlgInputBox);//OffBits为BITMAPINFOHEADER结构长度加调色板的大小OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHei14、ght*LineBytes;//要开的缓冲区的大小//为新产生的位图分配缓冲区内存 if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Errorallocmemory!","ErrorMessage",MB_OK15、MB_ICONEXCLAMATION);returnFALSE;//失败,返回}//lpImgData为指向原来位图数据的指针lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//lpTempIm16、gData为指向新产生位图数据的指针lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);lpPtr=(char*)lpImgData;lpTempPtr=(char*)lpTempImgData;//将新的缓冲区中的每个字节都填成255,这样以后未处理的象素就是白色memset(lpTempPtr,(BYTE)255,BufSize);//两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板memcpy(lpTempPtr,lpPtr,OffBits);//xVis17、ible为FALSE时,表示x方向已经移出了可显示的范围xVisible=TRUE;if(xOffset<=-bi.biWidth)xVisible=FALSE;elseif(x
2、0:图象区域的x范围从0到width-
3、tx
4、,对应原图的范围从
5、tx
6、到width;(3)07、t8、,对应原图的范围从9、t10、到height;yyy011、对应原图的范围从0到height-t;yyyty≥height,图象完全移出了屏幕,不用做任何处理。这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用memcpy函数,从(x,y)点开始,一次可以拷贝一整行(宽度为x-x),然后将内存指针移到(x,y+1)处,拷001000贝下一行。这样拷贝(y-y)行就完成了全部操作,避免了一个一个象素的计算,提高了效率。10Translation的源代码如下:intxOffset=0,yOffset=0;BOOLTranslation(HWNDhWnd){ DLGPROCdlgInpu12、tBox=NULL;OffBits,BufSize;lpImgData;DWORDLPBITMAPINFOHEADERLPSTRlpPtr;HLOCALhTempImgData;lpTempImgData;lpTempPtr;LPBITMAPINFOHEADERLPSTRintSrcX0,SrcY0,SrcX1,SrcY1;DstX0,DstY0,DstX1,DstY1;RectWidth,RectHeight;xVisible,yVisible;hDc;intintBOOLHDCHFILEinthf;i;//出现对话框,输入x偏移量xOf13、fset,和y偏移量yOffsetdlgInputBox=(DLGPROC)MakeProcInstance((FARPROC)InputBox,ghInst);DialogBox(ghInst,"INPUTBOX",hWnd,dlgInputBox);FreeProcInstance((FARPROC)dlgInputBox);//OffBits为BITMAPINFOHEADER结构长度加调色板的大小OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHei14、ght*LineBytes;//要开的缓冲区的大小//为新产生的位图分配缓冲区内存 if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Errorallocmemory!","ErrorMessage",MB_OK15、MB_ICONEXCLAMATION);returnFALSE;//失败,返回}//lpImgData为指向原来位图数据的指针lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//lpTempIm16、gData为指向新产生位图数据的指针lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);lpPtr=(char*)lpImgData;lpTempPtr=(char*)lpTempImgData;//将新的缓冲区中的每个字节都填成255,这样以后未处理的象素就是白色memset(lpTempPtr,(BYTE)255,BufSize);//两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板memcpy(lpTempPtr,lpPtr,OffBits);//xVis17、ible为FALSE时,表示x方向已经移出了可显示的范围xVisible=TRUE;if(xOffset<=-bi.biWidth)xVisible=FALSE;elseif(x
7、t
8、,对应原图的范围从
9、t
10、到height;yyy011、对应原图的范围从0到height-t;yyyty≥height,图象完全移出了屏幕,不用做任何处理。这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用memcpy函数,从(x,y)点开始,一次可以拷贝一整行(宽度为x-x),然后将内存指针移到(x,y+1)处,拷001000贝下一行。这样拷贝(y-y)行就完成了全部操作,避免了一个一个象素的计算,提高了效率。10Translation的源代码如下:intxOffset=0,yOffset=0;BOOLTranslation(HWNDhWnd){ DLGPROCdlgInpu12、tBox=NULL;OffBits,BufSize;lpImgData;DWORDLPBITMAPINFOHEADERLPSTRlpPtr;HLOCALhTempImgData;lpTempImgData;lpTempPtr;LPBITMAPINFOHEADERLPSTRintSrcX0,SrcY0,SrcX1,SrcY1;DstX0,DstY0,DstX1,DstY1;RectWidth,RectHeight;xVisible,yVisible;hDc;intintBOOLHDCHFILEinthf;i;//出现对话框,输入x偏移量xOf13、fset,和y偏移量yOffsetdlgInputBox=(DLGPROC)MakeProcInstance((FARPROC)InputBox,ghInst);DialogBox(ghInst,"INPUTBOX",hWnd,dlgInputBox);FreeProcInstance((FARPROC)dlgInputBox);//OffBits为BITMAPINFOHEADER结构长度加调色板的大小OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHei14、ght*LineBytes;//要开的缓冲区的大小//为新产生的位图分配缓冲区内存 if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Errorallocmemory!","ErrorMessage",MB_OK15、MB_ICONEXCLAMATION);returnFALSE;//失败,返回}//lpImgData为指向原来位图数据的指针lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//lpTempIm16、gData为指向新产生位图数据的指针lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);lpPtr=(char*)lpImgData;lpTempPtr=(char*)lpTempImgData;//将新的缓冲区中的每个字节都填成255,这样以后未处理的象素就是白色memset(lpTempPtr,(BYTE)255,BufSize);//两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板memcpy(lpTempPtr,lpPtr,OffBits);//xVis17、ible为FALSE时,表示x方向已经移出了可显示的范围xVisible=TRUE;if(xOffset<=-bi.biWidth)xVisible=FALSE;elseif(x
11、对应原图的范围从0到height-t;yyyty≥height,图象完全移出了屏幕,不用做任何处理。这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用memcpy函数,从(x,y)点开始,一次可以拷贝一整行(宽度为x-x),然后将内存指针移到(x,y+1)处,拷001000贝下一行。这样拷贝(y-y)行就完成了全部操作,避免了一个一个象素的计算,提高了效率。10Translation的源代码如下:intxOffset=0,yOffset=0;BOOLTranslation(HWNDhWnd){ DLGPROCdlgInpu
12、tBox=NULL;OffBits,BufSize;lpImgData;DWORDLPBITMAPINFOHEADERLPSTRlpPtr;HLOCALhTempImgData;lpTempImgData;lpTempPtr;LPBITMAPINFOHEADERLPSTRintSrcX0,SrcY0,SrcX1,SrcY1;DstX0,DstY0,DstX1,DstY1;RectWidth,RectHeight;xVisible,yVisible;hDc;intintBOOLHDCHFILEinthf;i;//出现对话框,输入x偏移量xOf
13、fset,和y偏移量yOffsetdlgInputBox=(DLGPROC)MakeProcInstance((FARPROC)InputBox,ghInst);DialogBox(ghInst,"INPUTBOX",hWnd,dlgInputBox);FreeProcInstance((FARPROC)dlgInputBox);//OffBits为BITMAPINFOHEADER结构长度加调色板的大小OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHei
14、ght*LineBytes;//要开的缓冲区的大小//为新产生的位图分配缓冲区内存 if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Errorallocmemory!","ErrorMessage",MB_OK
15、MB_ICONEXCLAMATION);returnFALSE;//失败,返回}//lpImgData为指向原来位图数据的指针lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);//lpTempIm
16、gData为指向新产生位图数据的指针lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);lpPtr=(char*)lpImgData;lpTempPtr=(char*)lpTempImgData;//将新的缓冲区中的每个字节都填成255,这样以后未处理的象素就是白色memset(lpTempPtr,(BYTE)255,BufSize);//两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板memcpy(lpTempPtr,lpPtr,OffBits);//xVis
17、ible为FALSE时,表示x方向已经移出了可显示的范围xVisible=TRUE;if(xOffset<=-bi.biWidth)xVisible=FALSE;elseif(x
此文档下载收益归作者所有