我有幾個不同的JPEG圖像,我一直在測試。據我所見,0和第一個字節總是0xFF
和0xD8
。JPEG圖像的第二個和第三個字節是否始終是APP0或APP1標記?
第二和第三段通常有0xFF
和0xE0
(APP0)指示任一指示EXIF段JFIF段或JFIF擴展段或0xFF
和0xE1
(APP1)。
我的問題:情況總是如此嗎?第二個和第三個字節是否始終爲APP0或APP1?
我有幾個不同的JPEG圖像,我一直在測試。據我所見,0和第一個字節總是0xFF
和0xD8
。JPEG圖像的第二個和第三個字節是否始終是APP0或APP1標記?
第二和第三段通常有0xFF
和0xE0
(APP0)指示任一指示EXIF段JFIF段或JFIF擴展段或0xFF
和0xE1
(APP1)。
我的問題:情況總是如此嗎?第二個和第三個字節是否始終爲APP0或APP1?
不。幾個創建沒有這些標記的JPEG或其他APP標記的相機。唯一可以依賴的是SOI序列,即FF D8
,即使所有相機都生成EOI。另外請注意,存在嵌入式JPEG的JPEG存在 - 您可以在圖像中嵌套SOI/EOI。
如果您需要處理原始相機圖像中的嵌入式JPEG數據,某些模型會生成類似JPEG的數據,只能通過jpeg規範稍微鬆懈來解析 - 尤其是與數據中的FF
字節有關。然後你的相機產生的專有數據乍看起來像JPEG數據(例如一些索尼的「加密」原始格式)
對,SOI標記將始終存在......不過,這個問題是關於APP0和APP1標記的。在任何情況下,我都看到他們接下來。我想知道這是否一定是這種情況,或者通常情況下是這樣。 – KeatsKelleher 2011-03-23 23:46:03
@akellehe我已經更新了我的答案。你想要什麼圖像?所有來自一組或來自多個來源? – alex 2011-03-23 23:46:36
他們來自許多不同的來源,經過驗證使用不同版本的Exif標準(也是JFIF)。我在這裏得到了它們:http://exif.org/samples.html – KeatsKelleher 2011-03-23 23:51:32
不,它當然不一定是這樣。閱讀Wikipedia。
就我所知,APPn段只是應用程序將任意數據嵌入到圖像文件中的方式。顯然,應用程序通常會利用這一點,並將0xFF 0xEO
或0xFF 0xE1
字節寫入標題中,但對於而不是的應用程序完全可行,只需繼續處理圖像數據即可。前兩個字節(0xFF和0xD8)是強制性的,因爲它們是SOI(圖像開始)標記。
通常是的,但是我對JPEG的理解是任何段類型都可以跟在頁眉之後。
對於JFIF文件,JFIF標頭應該在FFD8之後立即跟隨。 JFIF標題包含在APP0標記內。雖然規範沒有提到任何有關填充的內容。
沒有JFIF頭,我們只能猜測使用了什麼顏色格式。
不。有些程序可以刪除一些標記。 ImageOptim就是這樣一個程序。你只需要一些標記。這個程序也將優化huffman表格
事情很複雜。由於我目前正在編寫一個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'}
]
}
很好的答案。整個文件簽名/魔術字節主題非常模糊。你從哪裏得到這個json列表?我沒有在您發佈的鏈接上看到它。 – 2018-02-26 17:19:53
這是一個語言不可知的問題,所以你不需要* javascript *和* c *標籤。 – 2011-03-23 23:44:21
謝謝安迪...這是我迂迴的吹噓方式,這是在JavaScript中完成;) – KeatsKelleher 2011-03-23 23:49:54
heh,不用擔心 - 我已經使用* FileSystemObject *從前幾個字節創建一個zip文件。創建一個完整的JPEG文件的道具:-) – 2011-03-24 10:14:33