从字节数组验证JPEG - 特别是APP段

时间:2014-04-28 21:50:56

标签: image image-processing jpeg

我正在审查处理不同图像的遗留代码,包括JPEG。遗留代码使用4字节序列来确定byte []是否是有效的JPEG。具体做法是:

0xFF 0xD8 0xFF和0xE0或0xE1。

当我进行研究时,我发现你需要的只是0xFF 0xD8 0xFF,0xE0或0xE1是所谓的APP段(http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure)的一部分。此段是特定于应用程序的,我已完成的其他研究表明此段中至少有4个其他值可能(0xE2,0xE3,0xE8和0xED)。

我认为JPEG是JPEG是JPEG。给定具有6个已知/允许的APP段中的任何一个的文件,任何可以显示JPEG的设备都能够显示给定的文件。这是对的吗?

是否有充分理由根据APP细分的特定值进行过滤?

APP细分如何影响JPEG图像?它是否完全使用,或者是仅在显示应用程序识别其APP值时使用的应用程序特定数据?例如,我读到Photoshop使用0xED。因此,如果图像由Photoshop显示,那么APP段中的数据是有意义的 - 但对于任何其他非Photoshop的应用程序,APP段将被忽略,图像显示得很好。

注意:最后,Java applet将显示JPEG。

1 个答案:

答案 0 :(得分:2)

  

我认为JPEG是JPEG是JPEG。

实际上,大多数被称为“JPEG文件”的文件都是JFIF或Exif。 : - )

Exif使用JFIF的结构,因此你可以解析它们。但是因为JFIF指定第一个APP段必须是APP0 / JFJF,而Exif说对于Exif,第一个APP段必须是APP1 / Exif,它们并不真正兼容。一些JFIF在后面的段中包含Exif APP段,以将其用于元数据。某些“JPEG”既不包含Exif或JFIF APP段,但仍包含有效的JPEG代码流。大多数软件都掩盖了这一事实。

  

是否有充分理由根据APP细分的特定值进行过滤?

取决于。例如,如果要仅过滤掉Exif或仅过滤ISO JPEG,则为是。如果你想尽可能多地阅读“JPEG”,那么你显然不希望这样。

某些软件(即JPEGImageReaderSpi使用的默认Java ImageIO,正如您提到的Java)仅使用SOI标记(0xFF,0xD8)来标识JPEG。确保下一个字节是0xFF当然是一个额外的预防措施,以滤除误报。

  

APP细分如何影响JPEG图像?

某些APP段会影响压缩JPEG数据的解释方式。大多数JPEG阅读软件需要至少知道APP0 / JFIF,APP1 / Exif,APP2 / ICC_PROFILE,APP14 / Adob​​e来正确解释和转换压缩数据的颜色。忽略这些,很可能会产生具有奇怪外观或不准确颜色的图像。

APP0 / JFXX(缩略图扩展名),APP13 / Photoshop 3.0和APP1 / XMP标签等其他细分受众群主要用于元数据,可能会被忽略。

另请注意,APPn段以APPn标记后面的以null结尾的ASCII字符串开头,以完全识别APP段类型。仅仅看标记是不够的。

PS:要读取Java中的JPEG,您可能需要查看我的TwelveMonkeys ImageIO库,以扩展ImageIO可以读取的“JPEG”数量。