欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

c语言中实现自动平移,c语言实现图像的旋转与平移

发布时间:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 c语言中实现自动平移,c语言实现图像的旋转与平移 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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) 转载请注明出处!

总结

以上是生活随笔为你收集整理的c语言中实现自动平移,c语言实现图像的旋转与平移的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。