[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > C/C++ > 正文
C語言圖像處理方法
本文出自: 作者: (2001-06-26 21:04:00)
  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) 釋放內存圖像緩沖區。
  值得指出的是,這種處理方法不夠。為此可以採用另一種方法:先在圖像變換緩沖區中處理完畢,再將
變換的圖像一次顯示在屏幕上。這樣可以取得較好的顯示效果。   

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★