1.映像平移
映像平移只是改變映像在螢幕上的位置,映像本身並不發生變化。
假設原映像地區左上方座標為(x0, y0),右下角座標為(x1, y1),將映像分別沿x和y軸平移dx和dy,則新映像的左上方座標為(x0 +dx, y0+dy),右下角座標為(x1+dx, y1+dy)。座標平移變換公式為:
x′ = x + dx
y′ = y + dy
在螢幕上實現映像的移動分為四個步驟:
⑴ 儲存原映像到緩衝區。
⑵ 擦除原映像。
⑶ 計算平移後的新座標。
⑷ 在新的座標位置重新顯示原映像。
其中,擦除原映像的方法與圖形變換中擦除原圖形的方法一致,在實現中仍採用XOR異或方式畫圖擦除原映像。對於新座標值的計算還需要考慮邊界情況,不要在映像平移後超出允許的螢幕範圍。此外,如果採用C函數getimage()和putimage()來儲存和恢複映像,則映像的大小不能超過64K。
2.映像顛倒
映像顛倒是指把定義好的映像地區上下翻轉地顯示在螢幕上。分析映像顛倒的過程,可發現每行的映像資訊都保持不變,而只是改變了行的順序,將第一行與最後的第n行相互交換,第二行與第n-1行交換……,依此類推,從而實現了映像的顛倒。只需採用按行交換的方式,即可方便地修改緩衝區內容,實現映像的顛倒。基本步驟如下:
(1) 用getimage()儲存原映像,並擦除原映像。
(2) 計算映像的高度,即行數height;計算映像寬度width;計算儲存一行映像資訊
height = bottom - top + 1;
width = right - left + 1;
linebytes = (width + 7) / 8 * 4;
(3)利用行交換緩衝區linebuf在映像記憶體緩衝區中進行資訊交換,即把第一行與最末行交換,第2行與第n-1行交換……,依此類推,直至全部交換完畢。
(4)把交換後的映像緩衝區內容重新顯示在螢幕上。
3.映像鏡像變換
鏡像變換是指將指定地區的映像左右翻轉地顯示在螢幕。分析鏡像變換過程可以發現:每行映像資訊的處理方式是相同的,而且行順序不發生變化,只是每一行的像素資訊按從左至右的順序進行了左右顛倒,從而實現了鏡像變換。因此,採用按行逐點變換的方式實現映像的鏡像。
首先,對於左上方為(left, top),右下角為(right, bottom)矩形地區映像,給出其中任意點(x0, y0)鏡像變換後的新座標(x′, y′)的座標變換公式:
x = right - x0 + left
y′ = y0
根據以上公式,對各個像素點計算新座標後,直接把它顯示在螢幕的相應位置上。
如果完全逐點地進行交換,處理一個像素點就要讀取一次像素值,從而降低了變換速度。由於像素點是順序存放在各個bit位上,每讀取一個位元組就包含了8個像素點的資訊,只需設定不同的位屏值bitmask,就可以獲得不同像素點的資訊。因此採用按行逐位元組變換的方式,每讀一次就進行8個像素點的變換,以提高變換速度。
將一矩形地區的映像進行鏡像變換的基本步驟如下:
(1) 用getimage()把映像儲存到記憶體緩衝區,並擦除原映像。
(2) 計算映像高度,即行數高度height和寬度width;計算儲存一行映像資訊佔用的位元組數linebytes。計算公式如下:
height = bottom - top + 1;
width = right - left + 1;
linebyte = (width + 7) / 8 *4;
(3) 對映像進行鏡像。
(4)釋放記憶體配置圖像緩衝區。
4.映像旋轉
映像旋轉是指把定義的映像繞某一點以逆時針或順時針方向旋轉一定的角度,通常是指繞映像的中心以逆時針方向旋轉。
假設映像的左上方為(left, top),右下角為(right, bottom),則映像上任意點(x0, y0)繞其中心(xcenter,ycenter)逆時針旋轉angle角度後,新的座標位置(x′, y′)的計算公式為:
xcenter = (right - left + 1) / 2 + left;
ycenter = (bottom - top + 1) / 2 + top;
x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;
y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;
與映像的鏡像變換相類似,也採用按行逐點變換的方式實現映像的旋轉,其步驟如下:
(1) 用getimage()把映像儲存到記憶體緩衝區,並擦除原映像。
(2) 計算映像高度height,寬度width,及儲存一行映像資訊佔用的位元組數linebytes,計算公式與鏡像變換的計算公式相同。
(3) 對映像逐行進行旋轉變換。
(4) 釋放記憶體配置圖像緩衝區。
值得指出的是,這種處理方法不夠。為此可以採用另一種方法:先在映像變換緩衝區中處理完畢後,再將變換後的映像一次顯示在螢幕上。這樣可以取得較好的顯示效果。