2011-03-23 36 views
5

我有幾個不同的JPEG圖像,我一直在測試。據我所見,0和第一個字節總是0xFF0xD8JPEG圖像的第二個和第三個字節是否始終是APP0或APP1標記?

第二和第三段通常有0xFF0xE0(APP0)指示任一指示EXIF段JFIF段或JFIF擴展段或0xFF0xE1(APP1)。

我的問題:情況總是如此嗎?第二個和第三個字節是否始終爲APP0或APP1?

+1

這是一個語言不可知的問題,所以你不需要* javascript *和* c *標籤。 – 2011-03-23 23:44:21

+0

謝謝安迪...這是我迂迴的吹噓方式,這是在JavaScript中完成;) – KeatsKelleher 2011-03-23 23:49:54

+0

heh,不用擔心 - 我已經使用* FileSystemObject *從前幾個字節創建一個zip文件。創建一個完整的JPEG文件的道具:-) – 2011-03-24 10:14:33

回答

9

不。幾個創建沒有這些標記的JPEG或其他APP標記的相機。唯一可以依賴的是SOI序列,即FF D8,即使所有相機都生成EOI。另外請注意,存在嵌入式JPEG的JPEG存在 - 您可以在圖像中嵌套SOI/EOI。

如果您需要處理原始相機圖像中的嵌入式JPEG數據,某些模型會生成類似JPEG的數據,只能通過jpeg規範稍微鬆懈來解析 - 尤其是與數據中的FF字節有關。然後你的相機產生的專有數據乍看起來像JPEG數據(例如一些索尼的「加密」原始格式)

+1

備註:99%以上的JPEG樣本(來自各種相機)*都*具有APP0/APP1 - 我提到的例外情況並不常見,你真的不需要在通用解析器中處理它們 – Erik 2011-03-23 23:57:40

+2

我真的不明白你爲什麼要硬編碼到你的解析器中以期望這些數據,當你可以編程它來一次讀取一個段並根據其標題進行處理。 – mgiuca 2011-03-24 00:06:36

1

那些前兩個字節是JPEG SOI標記因此總是存在。

第二個和第三個字節似乎存儲元數據,這可能不存在於每個JPEG中。

Further Reading

+0

對,SOI標記將始終存在......不過,這個問題是關於APP0和APP1標記的。在任何情況下,我都看到他們接下來。我想知道這是否一定是這種情況,或者通常情況下是這樣。 – KeatsKelleher 2011-03-23 23:46:03

+0

@akellehe我已經更新了我的答案。你想要什麼圖像?所有來自一組或來自多個來源? – alex 2011-03-23 23:46:36

+0

他們來自許多不同的來源,經過驗證使用不同版本的Exif標準(也是JFIF)。我在這裏得到了它們:http://exif.org/samples.html – KeatsKelleher 2011-03-23 23:51:32

2

不,它當然不一定是這樣。閱讀Wikipedia

就我所知,APPn段只是應用程序將任意數據嵌入到圖像文件中的方式。顯然,應用程序通常會利用這一點,並將0xFF 0xEO0xFF 0xE1字節寫入標題中,但對於而不是的應用程序完全可行,只需繼續處理圖像數據即可。前兩個字節(0xFF和0xD8)強制性的,因爲它們是SOI(圖像開始)標記。

1

通常是的,但是我對JPEG的理解是任何段類型都可以跟在頁眉之後。

0

對於JFIF文件,JFIF標頭應該在FFD8之後立即跟隨。 JFIF標題包含在APP0標記內。雖然規範沒有提到任何有關填充的內容。

沒有JFIF頭,我們只能猜測使用了什麼顏色格式。

0

理論上,是的。根據JFIF spec(pdf),它的APP0部分應該在文件中首先出現。而Exif spec(pdf)需要相同的APP1部分。

但是,您不應該依賴APPn部分的順序(甚至是存在);那裏有瘋狂的JPEG作家。從SOI開始,閱讀部分。

1

不。有些程序可以刪除一些標記。 ImageOptim就是這樣一個程序。你只需要一些標記。這個程序也將優化huffman表格

1

事情很複雜。由於我目前正在編寫一個JavaScript文件標識符,因此我會嘗試用我的javascript對象來回答JPEG。 特別是因爲問題有一個「JavaScript」標記。

已經給出了基本答案(接受的答案),但這更詳細地介紹瞭如何檢查不同的App標記(使用後備)。到目前爲止,JFIF,EXIF,Adobe,Canon和三星都有特殊的APP0(但我們對未來不瞭解)。所以js對象的邏輯是:

如果其中一個SPECS [x] .regex匹配,它會贏(第一個贏)。但如果沒有匹配,父對象(僅FFd8)獲勝。根據PRONOM標識符

規格對象提供- 你可以查看它們像這樣

'http://apps.nationalarchives.gov.uk/pronom/fmt/' .concat(PUID)[官] 'http://apps.nationalarchives.gov.uk/pronom/x-fmt/' .concat(xPUID)[實驗]

_FFD8: { 
    SPECS: [ 
     { 
      PUID: 112, 
      regex: /^FFD8FFE8(.{2})53504946460001/, 
      desc: 'jpeg: Still Picture Interchange Format file (SPIF)', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.00' 
      } 
     }, 
     { 
      PUID: 44, 
      regex: /^FFD8FFE0(.{2})4A464946000102/, 
      desc: 'jpeg: JPEG File Interchange Format file (JFIF), v. 1.02', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.02', 
      } 
     }, 
     { 
      PUID: 43, 
      regex: /^FFD8FFE0(.{2})4A464946000101/, 
      desc: 'jpeg: JPEG File Interchange Format file (JFIF), v. 1.01', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.01', 
      } 
     }, 
     { 
      PUID: 42, 
      regex: /^FFD8FFE0(.{2})4A464946000100/, 
      desc: 'jpeg: JPEG File Interchange Format file (JFIF), v. 1.00', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.00', 
      } 
     },   
     { 
      PUID: 41, 
      xPUID: 398, 
      regex: /^FFD8FFE1(.{2})45786966000049492A00(.+)009007000400000030323030/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), little endian, v. 2.0', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'little', 
       version: '2.0', 
      } 
     }, 
     { 
      PUID: 41, 
      xPUID: 398, 
      regex: /^FFD8FFE1(.{2})4578696600004D4D002A(.+)900000070000000430323030/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), big endian, v. 2.0', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'big', 
       version: '2.0', 
      } 
     },    
     { 
      PUID: 41, 
      xPUID: 390, 
      regex: /^FFD8FFE1(.{2})45786966000049492A00(.+)009007000400000030323130/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), little endian, v. 2.1', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'little', 
       version: '2.1', 
      } 
     }, 
     { 
      PUID: 41, 
      xPUID: 390, 
      regex: /^FFD8FFE1(.{2})4578696600004D4D002A(.+)900000070000000430323130/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), big endian, v. 2.1', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'big', 
       version: '2.1', 
      } 
     },   
     { 
      PUID: 41, 
      xPUID: 391, 
      regex: /^FFD8FFE1(.{2})45786966000049492A00(.+)009007000400000030323230/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), little endian, v. 2.2', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'little', 
       version: '2.2', 
      } 
     }, 
     { 
      PUID: 41, 
      xPUID: 391, 
      regex: /^FFD8FFE1(.{2})4578696600004D4D002A(.+)900000070000000430323230/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), big endian, v. 2.2', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'big', 
       version: '2.2', 
      } 
     }, 
     // specific JPEG (all begin with FFD8FF, map them to PUID 41) 
     { 
      PUID: 41, 
      regex: /^FFD8FFED/, 
      desc: 'jpeg: JPG Image File, Adobe JPEG, Photoshop CMYK buffer' 
     }, 
     { 
      PUID: 41, 
      regex: /^FFD8FFE2/, 
      desc: 'jpeg: JPG Image File, Canon JPEG, Canon EOS-1D' 
     }, 
     { 
      PUID: 41, 
      regex: /^FFD8FFE3/, 
      desc: 'jpeg: JPG Image File, Samsung JPEG, e.g. Samsung D500' 
     }, 
     { 
      PUID: 41, 
      regex: /^FFD8FFDB/, 
      desc: 'jpeg: JPG Image File, Samsung JPEG, e.g. Samsung D807' 
     } 
    ], 
    ext: ['JPG', 'JPE', 'JPEG', 'SPF', 'SPIFF'], 
    signature: [ 255, 216 ], 
    desc: 'jpeg: JPEG File Interchange Format file, App0 marker not known', 
    mime: 'image/jpeg', 
    specifications: [ 
     { text:'Specification for the JFIF file format', href:'http://www.w3.org/Graphics/JPEG/jfif3.pdf', type:'W3', format:'pdf' }, 
     { text:'The JPEG compression specification', href:'http://www.w3.org/Graphics/JPEG/itu-t81.pdf', type:'W3', format:'pdf' }, 
     { text:'Exchangeable image file format for digital still cameras', href:'http://home.jeita.or.jp/tsc/std-pdf/CP3451C.pdf', type:'vendor', format:'pdf' } 
    ], 
    references: [ 
     { text:'JPEG JFIF W3 Info', href:'http://www.w3.org/Graphics/JPEG/', type:'W3', format:'html' }, 
     { text:'JPEG.org', href:'http://www.jpeg.org/', type:'info', format:'html' }, 
     { text:'JPEG Exif App markers', href:'http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html', type:'info', format:'html'} 
    ] 
} 
+0

很好的答案。整個文件簽名/魔術字節主題非常模糊。你從哪裏得到這個json列表?我沒有在您發佈的鏈接上看到它。 – 2018-02-26 17:19:53

相關問題