2011-12-19 32 views
2

我正在解碼jpeg文件。我已經生成了霍夫曼表和量化表,並且我已經到了必須解碼DC和AC元素的地步。例如可以說我有一個數據從jpeg文件生成交流元素

FFDA 00 0C 03 01 00 02 11 03 11 00 3F 00 F2 A6 2A FD 54 C5 5F FFD9 

如果我們忽略SOS標誌幾個字節,我真正的數據是從F2字節開始。所以讓我們以二進制(從F2字節開始)寫:

1111 0010 1010 0110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111 
    F 2 A 6 2  A F D 5 4 C 5 5 F 

在解碼時,第一要素是亮度DC元素讓我們對其進行解碼。

[1111 0]010 1010 0110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111 
    F 2 A 6 2  A F D 5 4 C 5 5 F 

因此11110是霍夫曼代碼(在我的情況下)元素08。這意味着接下來的8位是我的DC值。當我取下8位時,值爲:

1111 0[010 1010 0]110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111 
    F 2 A 6 2  A F D 5 4 C 5 5 F 

DC元件值爲-171。

這是我的問題:接下來是亮度AC值,但是我不是真正瞭解AC時非零的情況下的標準嗎? TNX!

+1

我可以推薦一個叫衝動的冒險網站,解釋了JPEG – Jimmy 2011-12-20 14:55:33

+0

需要大量的解碼我已經訪問過並分析了推薦頁面,但是當交流元素爲零時有例子。 – MrD 2011-12-21 01:00:35

+0

你可以從上面的網站下載jpeg snoop源代碼,這應該回答你有關於jpeg解碼的任何其他問題 – Jimmy 2011-12-21 13:28:16

回答

4

正如您所見,DC值被定義爲指定正或負DC值的「額外」位數。 AC係數的編碼方式不同,因爲它們中的大部分都是0.哈夫曼表爲AC係數的每個條目定義了「跳過」值和「額外位」長度。跳過值是在存儲該值之前跳過多少個AC係數,並且額外的位以與DC值相同的方式處理。對AC係數進行解碼時,可以解碼1到63的值,但MCU編碼的結束方式可能會有所不同。您可以將實際值存儲在索引63處,或者如果您的索引大於48,則可以獲得ZRL(零運行長度= 16個零)或任何組合,這會將您帶到最後。簡化的解碼循環:

void DecodeMCU(signed short *MCU) 
{ 
int index; 
unsigned short code, skip, extra; 

    MCU[0] = decodeDC(); 
    index = 1; 
    while (index < 64) 
    { 
     code = decodeAC(); 
     skip = code >> 4; // skip value 
     extra = code & 0xf; // extra bits 
     index += skip; 
     MCU[index++] = calcACValue(extra); 
    } 
} 

顏色分量可以交錯(典型)或存儲在單獨的掃描中。元件在每個MCU中以Z字形順序編碼(首先是低頻元件)。定義MCU的8×8係數塊的數量取決於顏色子採樣。對於1:1,將會有1個Y,然後是1個Cr和1個Cb。對於典型的數碼相機圖像,水平軸進行二次採樣,所以您將得到2個Y塊,然後是1個Cr和1個Cb。壓縮圖像的質量設置決定了所使用的量化表以及多少個零AC係數被編碼。質量越低,每個MCU的零點就越多。當您在MCU上執行逆DCT時,零的數量將決定您的8x8,16x8,8x16或16x16像素塊中保留了多少細節。下面是基本步驟:

1)熵解碼的8×8係數的塊,每個顏色分量被分開存儲
2)去交錯和去量化的係數
3)上的係數執行逆DCT(可能對於6個8×8塊的4:2:0子採樣)
4)轉換從的YCrCb的色彩空間爲RGB或任何你需要

+0

這幫了我很多。你說過「顏色分量可以交錯(典型)或存儲在單獨的掃描中」。我如何從文件生成這些信息? – MrD 2011-12-23 16:33:16

+1

在SOF(幀開始)標題中,它指定了顏色分量的數量(對於普通彩色圖像通常爲3)。 SOS(掃描開始)標題告訴您掃描中有多少種顏色成分。如果它是3,則顏色交錯,如果顏色較少,則顏色存儲在單獨的掃描中。 – BitBank 2011-12-23 17:32:23

+0

非常感謝你救了我。 – MrD 2011-12-23 19:22:53