跳轉到內容

計算機圖形學概念/輸出空間/數字影像表示

來自華夏公益教科書,開放的書籍,開放的世界

現在我們已經涵蓋了如何表示影像和顏色的基礎知識,我們可以將這些資訊組合成更詳細的數字影像表示圖。我們之前注意到,數字影像只是一組顏色值,現在我們瞭解瞭如何在 RGB 顏色空間中將顏色表示為數字,我們可以將這些資訊結合起來以獲得更詳細的影像。

使用 RGB 顏色系統的每個光柵影像畫素都包含三個 RGB 值。

正如您所料,影像的數字表示只是一個 RGB 值三元組陣列。具體來說,可以將影像視為這些顏色值的矩形網格。如果我們處理的是我們希望為 800 x 600 畫素的影像,那麼我們將有一個數組,該陣列在影像的寬度上具有 800 個 RGB 顏色值,在影像的長度上具有 600 個 RGB 顏色值。

正如您所料,透過其 (x,y) 座標引用任何給定畫素很方便。在這個座標系中,(0,0) 是左上角的畫素,(寬度,高度) 是右下角的畫素,其中寬度和高度分別表示影像的寬度和高度(使用上面的例子,它們將分別為 800 和 600)。因此,當您水平橫跨影像時,x 值會增加,而當您向下移動影像時,y 值會增加,這在最初可能違反直覺。

這是一個相當任意的組織(事實上,在某些影像格式中,(0,0) 是左下角的畫素,正如您從熟悉的笛卡爾座標系中所期望的那樣),但這是我們在整本書中將假設的組織,並且它也是實踐中最廣泛使用的組織。從計算機設計師的角度來看,使用這種組織有一個實際的好處,但計算機圖形程式設計師很少看到它的好處。好處是:當計算機顯示器顯示影像時,它會從左到右,從上到下,橫跨顯示器上所有畫素掃描光束。因此,在將影像傳送到顯示器時,首先給它繪製的內容更有意義。

還值得注意的是,從一種表示形式轉換為另一種表示形式很容易。例如,如果您希望將螢幕視為具有熟悉的座標系,那麼您可以簡單地按照您喜歡的方式編寫程式碼,然後在顯示到螢幕之前重新排序行。另一種選擇是將您想要訪問的每個 y 座標替換為 (height-y)。因此,當您嘗試訪問您認為是螢幕底部的行 (y=0) 時,您將改為訪問 (y=800-0=800),這是計算機顯示器認為的螢幕底部行。最後,畫素必須朝著一個方向或另一個方向移動,而這是一種熟悉且常用的格式。

在計算機記憶體中,影像以這種非常直接的方式佈局,作為一個連續的記憶體塊。每個畫素都為表示其顏色分量的三個數字分配了足夠的儲存空間,並且影像中的第一個畫素 (0,0) 是記憶體塊中的第一個畫素。下一個最高記憶體地址是行中的下一個畫素 (1,0),依此類推。最終,記憶體塊中的最後一個畫素是位於位置 (寬度,高度) 的畫素。

例如,假設我們有一個記憶體中的影像,大小為 800 x 600 畫素,影像的第一個畫素位於記憶體地址 100,並且每個 RGB 分量的尺寸由 r 給出。然後地址 100 處的 r 個位元組是 (0,0) 處的畫素,地址 100+r 處的 r 個位元組是 (1,0) 處的畫素,地址 100+2*r 處的 r 個位元組是 (2,0) 處的畫素。如果我們想要訪問 (5,5) 處畫素的畫素資料,我們需要訪問地址 100+5*寬度*r+5*r 處的 r 個位元組。也就是說,我們需要將第一個 5 行的位元組數 (5*寬度*r) 新增到基地址,再加上該畫素所在行的位元組數。一般來說,我們可以透過訪問 baseAddress+y*寬度*r+x*r 來訪問記憶體中的畫素 (x,y)。這個公式不必記住,但重要的是要理解記憶體中的影像資料不是二維的,而是一維的,我們只是透過解釋方式賦予資料二維的組織。

華夏公益教科書