跳轉到內容

JPEG - 想法與實踐/解碼與繪製

來自華夏公益教科書

從檔案中繪製圖像的程式必須以相反的順序執行我們已經完成的所有操作。影像的寬度和高度以及質量因子必須從標題中讀取。

讓我們總結一下在構建檔案資料部分時必須執行的操作

將影像劃分為 sxs 方塊
對於每個方塊
對於每個點,將 RGB 值轉換為 YCbCr 值
對於 Y、Cb 和 Cr 分量,對 s2 個數字進行餘弦變換
按照之字形原則對這 3 x s2 個數字進行排序
用從前一個方塊的模擬數字推匯出的值替換 s2 序列的第一個數字(DC 項)
對 3 x s2 個數字進行量化
在生成的整數序列中,用其長度(可能為 0)替換每個連續的零序列
將每個整數寫為位元序列(包含兩部分:程式碼和數字表達式),以便這些序列可以連線在一起形成連續的位元流。

在讀取標題(宣告寬度、高度和質量因子)後,我們必須將檔案中讀取的每個位元組轉換為 8 位塊,然後解碼生成的位元流。確定每個整數的位元序列包含兩部分。第一部分形成一個程式碼,該程式碼的設計使得我們可以看到它的結束位置。我們對其進行解碼,並以此方式獲得一個自然數 m。序列的第二部分是流中的接下來的 m 個位元,而這 m 個位元是整數的二進位制數字表達式。但是,如果此序列以 0 開頭,則表示該整數為負數,並且必須將 0 替換為 1。每個第二個整數(為非負數)表示零的個數,我們(想象我們)寫下這些零。我們這樣做直到我們有足夠的數字來繪製圖像的 sxs 方塊,即 3 x s2 個數字。這 3 x s2 個數字是透過對三個分量的 s2 個顏色值進行餘弦變換和量化而獲得的。首先,它們必須透過乘以我們除以的數字來去量化。在此之後,每個 s2 序列的第一個數字(DC 項)必須加到前一個 sxs 方塊的對應數字,因為這些數字表示差異。透過逆之字形過程,每個三個 s2 序列被轉換為一個 sxs 數字矩陣 g(u, v),u, v = 0, 1, ..., s-1,並將逆餘弦變換應用於此矩陣,從而得到一個矩陣 f(i, j),i, j = 0, 1, ...,s-1,該矩陣包含 Y、Cb 和 Cr 分量的顏色值。對於 sxs 方塊中的每個點 (i, j),三個顏色值 f(i, j) 構成一個 YCbCr 三元組,該三元組被轉換為一個 RGB 三元組,並且影像中對應於方塊中點 (i, j) 的點用這些 RGB 值著色。

華夏公益教科書