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语言实现图像的旋转与平移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java必知必会_Java构造器必知必会
- 下一篇: 百度搜索引擎优化指南3.0_深圳网站搜索