2014-11-03 104 views
4

有一個question with the same title但不幸的是它不能幫助我。解析JPEG SOS標記

我想解析一個SOS標記的數據。我可以找到的所有文檔都說,在標記(0xFFDA)後面跟隨一個兩字節數字,它定義了該段的長度 - for example here - 與大多數可變大小的標記一樣。但在這種情況下,我似乎沒有正確理解它。它適用於所有其他標記類型。

我檢查了多個文件,但不能得到這個權利。這個數字沒有定義完整的SOS字段有多長?因此,對於基線JPEG,應該有一個SOS片段,在此之後應該結束圖像標記。如果是漸進的,可以有多個SOS段,但仍然都應該有一個長度字段。

我有一張帶有SOF0標記的圖片,所以它應該是基線。我相信這是正確的SOFn標記,因爲可以在該標記之後找到圖像分辨率。使用十六進制編輯器,我發現3 0xFFDA標記,並且它們全部在以下2個字節中有0x000C。因此,據我瞭解,該段應始終爲12字節。但在所有3種情況下,在12個字節的數據之後沒有新的標記。我想最後一個是我正在尋找的掃描,因爲如果值0xFF出現,它後面是0x00 - 除了重置標記。

這兩個字節跟在0xFFDA之後不是長度字段嗎?

編輯: 所以感謝意見,回答似乎是實際的壓縮數據,只知道它在哪裏結束似乎對其進行解碼方式沒有長度字段。

爲什麼基線DCT圖像有多個掃描?我會理解爲什麼它有兩個;主圖像和縮略圖,但第三次掃描是什麼?

但還有一件事。根據DRI標記(定義重新啓動間隔),它包含掃描應該有一個重新開始標記0xFFD0 - 0xFFD7之後的值。但我似乎錯誤地認爲,或者我不這樣做是正確的。例如,標記包含值0x0140作爲重新啓動間隔。在下面的掃描中,我從頭開始搜索第一個0xFFD0,但後來是862字節而不是320.

+2

FFDA之後的2個字節是長度(12),但緊接在SOS標記之後是壓縮圖像數據。您需要解碼數據的「掃描」,並且下一個FFxx標記將位於壓縮數據之後。 – BitBank 2014-11-03 14:06:29

+0

@BBBank,所以沒有字段告訴我壓縮數據有多長? – ap0 2014-11-03 15:10:06

+0

壓縮數據沒有長度字段;必須對其進行解碼才能找到結尾,或者如果必須知道結束位置,請在FFDA之後查找下一個FFD9標記。 – BitBank 2014-11-03 17:16:32

回答

3

SOS標記包含壓縮數據;這是JPEG流中最複雜的部分。 SOFn標記指示數據的格式。 SOF0和SOF1的處理方式相同。 SOF2(漸進式)有很大不同。 (SOFn標記的讀取不常用或通常支持)。

長度是SOS頭的長度,而不是壓縮數據。大部分標題僅適用於逐行掃描(SOF2)。

壓縮數據在標題後面。壓縮的數據沒有長度。您必須掃描數據才能找到下一個標記。

+1

您不必解碼數據即可找到SOF標記的結尾。掃描流中的FF。 FFFF表示壓縮的FF值(跳過這些值)。 FFD0 - FFD7是重新啓動標記。忽略這些。任何其他的FFxx值應該是流中的下一個塊。除非你解壓縮,重啓標記才意味着什麼。它們是MCU間隔,而不是字節間隔。 – user3344003 2014-11-04 17:25:40

+0

由於某些原因,這是不正確的,因爲可以創建FF作爲值和沿。所以如果你使用它,你必須檢查更多的信息。 – 2016-03-14 16:35:10

+1

我有一個錯誤。 FF編碼爲FF00。這就是你必須檢查除重新啓動標記之外的所有內容。 – user3344003 2016-03-15 00:16:04