2.1 平移
初始座標爲(x0,y0)的點經過平移(tx,ty)(以向右,向下爲正方向)後,座標變爲(x1,y1)。這兩點之間的關係是x1=x0+tx ,y1=y0+ty。
其矩陣表示爲:
其逆矩陣表示爲:
逆運算在計算平移後的RGB值有幫助。通過結果點,利用逆運算計算原點RGB值。
1. 灰度圖是指只含亮度信息,不含色彩信息的圖象,就象我們平時看到的黑白照片:亮度由暗到明,變化是連續的。可以通過RGB各項都相同的256色調色板來表示,例如:(0,0,0)是全黑色,(255,255,255)是全白色,中間的是灰色。
2. YUV——Y分量的物理含義就是亮度,U和V分量代表了色差信號。這種表示方法有兩個優點:1)Y分量包含所有亮度信息,只用Y分量就能完全能夠表示出一幅灰度圖來。當同時考慮U,V分量時,就能夠表示出彩色信息來。可以方便的實現灰度和彩色圖之間切換。2)在對圖像壓縮時,可以着重考慮Y分量的值。
平移的算法實現:
1. 創建對話框,獲取偏移量值:xOffset,yOffset
2. 計算新圖像所需的緩衝區大小並分配局部內存空間。
3. 定義兩個指針lpImgData和lpTempImgData分別指向原和新文件的內存。
4. 初始化lpTempImgData指向的緩衝區。
5. 計算平移前和平移後最左上角和最右下角的座標,從而得出平移後的圖像高。
6. 找出平移前和平移後圖像數據最左邊的地址(見下面的代碼提示,這個表達式想蠻久纔想通的,爲了怕以後忘記,還自己做了個flash,不錯!學了flash第一次做出自己東西的感覺真好!),按行進行復制。
lpPtr=(char*)lpImgData+(BufSize-LineBytes-(i+SrcY0)*LineBytes)+SrcX0;
lpTempPtr=(char*)lpTempImgData+(BufSize-LineBytes-(i+DstY0)*LineBytes)+DstX0;
1. 釋放原來的位圖句柄
2. 產生新的位圖,將平移後的圖象存成文件,釋放資源和內存。
注:bmp圖像數據存儲順序是從下至上,從左至右。
1.定義 旋轉通常是以中心爲原點進行,這裏討論旋轉後圖像擴大的情況。將一個點順時針旋轉a角後的座標變換公式,如圖2.10所示,r爲該點到原點的距離,在旋轉過程中,r保持不變;b爲r與x軸之間的夾角。
圖2.10 旋轉示意圖
旋轉前:x0=rcosb;y0=rsinb
旋轉a角度後:
x1=rcos(b-a)=rcosbcosa+rsinbsina=x0cosa+y0sina;
y1=rsin(b-a)=rsinbcosa-rcosbsina=-x0sina+y0cosa
2. 座標系轉換:以左上角爲原點座標系 和以中心點爲原點座標系 之間的轉換矩陣爲:其中設圖象的寬爲w,高爲h。
3. 變換步驟:
1)將座標系o’變成o;
2)將該點順時針旋轉a角;
3)將座標系o變回o’,這樣,我們就得到了變換矩陣,是上面三個矩陣的級聯。
逆變換爲
鏡象(mirror)分水平鏡象和垂直鏡象兩種。設原圖寬爲w,高爲h,變換後,圖的寬和高不變。
水平鏡象的變化矩陣爲:
垂直鏡象的變化矩陣爲:
轉置(transpose)是指將x,y座標對換,轉置後圖的寬高對換了。
假設放大因子爲ratio,(爲了避免新圖過大或過小,我們在程序中限制0.25≤ratio≤4)。
第二章終於結束了,雖然沒有代碼實現,但看了書上的代碼,都能看懂!希望快點能找到顯示位圖的代碼錯誤,這樣我纔可以實現接下來的代碼嘛!也怪自己,太要面子了,不會可以問咯!就是死要面子,不過這樣也好,別人告訴我的,終究不如自己發現的。現在在看《深入淺出MFC》,講機制原理性的比較多,要的就是這方面的。加油~ 誓要把那個錯誤揪出來... ...
已解決:Q1:執行結果,只對圖片的左半邊作用?
A1:原來是圖片的問題,我原來用的是QQ截圖產生的BMP圖片,後來無意中嘗試轉爲256色圖,後來就可以用了。幾何變換沒有問題了。不過還不知道QQ截圖到底爲什麼不行