2011-12-19 6 views
2

jpegファイルをデコードしています。私はハフマンテーブルと量子化テーブルを生成しました。私はDCとACの要素を解読する必要があります。例えば、私は次のデータ jpegファイルからAC要素を生成する

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

+0

に必要なデコーディングの多くを説明するインパルス冒険と呼ばれるウェブサイトをお勧めすることができます4 6つの8×8ブロックで私はすでに推奨ページを訪問し分析していますが、AC要素がゼロの場合などの説明があります。 – MrD

+0

上記のサイトからjpeg snoopのソースコードをダウンロードすることができます。これは、jpegデコードに関する他の質問にお答えします。 – Jimmy

答えて

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で最初にジグザグの順序でエンコードされます(最初に低周波要素)。 MCUを定義する係数の8×8ブロックの数は、色のサブサンプリングに依存して変化する。 1:1の場合、1つのYと1つのCrと1つのCbが続きます。一般的なデジタルカメラの画像では、横軸がサブサンプリングされているので、1つのCrと1つのCbが続く2つのYブロックが得られます。圧縮画像の品質設定は、使用される量子化テーブルと、符号化されるゼロのAC係数の数を決定する。品質が低いほど、各MCUの数がゼロになります。 MCUで逆DCTを実行すると、8x8,16x8,8x16、または16x16ピクセルのブロックでどのくらい詳細が保持されるかが決まります。ここで基本的な手順である:

1)エントロピーは、8×8係数ブロックを復号化する、各色成分を別々
2格納されている)デジグザグと係数
3を脱量子化)係数に対して逆DCTを実行する(かもしれません2:0サブサンプリング)
4)のYCrCbからRGBへの色空間を変換するか、

+0

これは私を大いに助けました。あなたは、 "色成分はインターリーブされる(典型的)か、別々のスキャンで保存される"と言いました。ファイルからその情報をどのように生成するのですか? – MrD

+1

SOF(フレーム開始)ヘッダーでは、カラーコンポーネントの数を指定します(通常は通常のカラーイメージの場合は通常3)。 SOS(スキャンの開始)ヘッダーは、スキャンに含まれるカラーコンポーネントの数を示します。 3の場合、色はインターリーブされ、少ない場合は色が個々のスキャンに格納されます。 – BitBank

+0

大変ありがとうございました。 – MrD

関連する問題