y
y
y
(4) ty≥height,图象完全移出了屏幕,不用做任何处理。
这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的。利用 memcpy函数, 从(x ,y )-x )处,拷 0 0 点开始,一次可以拷贝一整行(宽度为 x1 0 ,然后将内存指针移到(x ,y +1)0 0 贝下一行。这样拷贝(y -y )1 0 行就完成了全部操作,避免了一个一个象素的计算,提高了效率。 Translation的源代码如下: int xOffset=0,yOffset=0; BOOL Translation(HWND hWnd) {
DLGPROC DWORD
dlgInputBox = NULL; OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData; LPSTR HLOCAL
lpPtr;
hTempImgData;
LPBITMAPINFOHEADER lpTempImgData; LPSTR int int int BOOL HDC HFILE int
lpTempPtr;
SrcX0,SrcY0,SrcX1,SrcY1; DstX0,DstY0,DstX1,DstY1; RectWidth,RectHeight; xVisible,yVisible; hDc; hf; i;
//出现对话框,输入 x偏移量 xOffset,和 y偏移量 yOffset
dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox,ghInst ); DialogBox (ghInst, \FreeProcInstance ( (FARPROC) dlgInputBox );
//OffBits为 BITMAPINFOHEADER结构长度加调色板的大小 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);
BufSize=OffBits+bi.biHeight*LineBytes;//要开的缓冲区的大小 //为新产生的位图分配缓冲区内存
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL) {
MessageBox(hWnd,\MB_ICONEXCLAMATION); return FALSE; //失败,返回 }
//lpImgData为指向原来位图数据的指针
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); //lpTempImgData为指向新产生位图数据的指针
lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); lpPtr=(char *)lpImgData;
lpTempPtr=(char *)lpTempImgData;
//将新的缓冲区中的每个字节都填成 255,这样以后未处理的象素就是白色 memset(lpTempPtr,(BYTE)255,BufSize);
//两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板 memcpy(lpTempPtr,lpPtr,OffBits);
//xVisible为 FALSE时,表示 x方向已经移出了可显示的范围 xVisible=TRUE; if( xOffset<= -bi.biWidth ) xVisible=FALSE; else if( xOffset<=0){
DstX0=0; //表示移动后,有图区域的左上角点的 x坐标
DstX1=bi.biWidth+xOffset; //表示移动后,有图区域的右下角点的 x坐标 }
else if ( xOffsetxVisible=FALSE;
SrcX0=DstX0-xOffset; //对应 DstX0在原图中的 x坐标 SrcX1=DstX1-xOffset; //对应 DstX1在原图中的 x坐标 RectWidth=DstX1-DstX0; //有图区域的宽度
//yVisible为 FALSE时,表示 y方向已经移出了可显示的范围 yVisible=TRUE;
if( yOffset<= -bi.biHeight ) yVisible=FALSE; else if( yOffset<=0){
DstY0=0; //表示移动后,有图区域的左上角点的 y坐标
DstY1=bi.biHeight+yOffset; //表示移动后,有图区域的右下角点的 y坐标 }
else if ( yOffset} else
yVisible=FALSE;
SrcY0=DstY0-yOffset; //对应 DstY0在原图中的 y坐标 SrcY1=DstY1-yOffset; //对应 DstY1在原图中的 y坐标 RectHeight=DstY1-DstY0; //有图区域的高度
if( xVisible && yVisible){ //x,y方向都没有完全移出可显示的范围 for(i=0;i//lpPtr指向要拷贝的那一行的最左边的象素对应在原图中的位 //置。特别要注意的是,由于.bmp是上下颠倒的,偏移是 //(BufSize-LineBytes-(i+SrcY0)*LineBytes)+SrcX0,而不是 //(i+SrcY0)*LineBytes)+SrcX0,你试着举个例子就明白了。 lpPtr=(char*)lpImgData+(BufSize-LineBytes- (i+SrcY0)*LineBytes)+SrcX0;
//lpTempPtr指向要拷贝的那一行的最左边的象素对应在新图中//的位置。同样要注意上面// 的问题。
lpTempPtr=(char*)lpTempImgData+
(BufSize-LineBytes-(i+DstY0)*LineBytes)+DstX0; //拷贝一行(宽度为 RectWidth)
memcpy(lpTempPtr,lpPtr,RectWidth);
} }
以上是由77cn范文大全为大家整理的c语言实现图像的旋转与平移的相关范文,本文关键词为语言,实现,图像,旋转,平移,实验,图象,几何,变换,参考资,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。
c语言实现图像的旋转与平移.doc
免费范文网为全国范文类知名网站,下载全文稍作修改便可使用,即刻完成写稿任务。
已有11人下载
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库c语言实现图像的旋转与平移在线全文阅读。
本文来自:免费范文网(www.77cn.com.cn) 转载请注明出处!