JPG文件中的文本注释是如何工作的?

6

JPG文件可以通过FF FE标记包含文本注释。我有几个问题:

  1. 我如何指定注释的长度?如果评论在文件末尾,是否可能根本不指定长度?

  2. 是否可能有一个仅由评论组成而没有图像的有效JPG文件?这样的文件在二进制中看起来像什么?我假设它将是:

FF D8    - SOI:图像开始(注意没有跟随帧数据)
FF D9    - EOI:图像结束
FF FE    - COM:文本注释
(二进制) - (文本)

1
注释的长度与其他JPEG元数据的长度指定方式相同。无法跳过长度,因为它是JPEG标记结构的一部分。如果图像数据缺失,我不确定JPEG文件是否被视为有效;这取决于具体的软件作者是否会拒绝它。 - BitBank
@BitBank 谢谢,您能详细说明一下吗(长度如何指定),并将其作为答案添加吗? - mafu
2个回答

5

JPEG元数据以以下标签结构存储:

0xFF - 标签引导符
0xXX - 标签值
0xXX 0xXX - 包括长度的大端顺序的标记长度(2)
< 标记数据(长度-2个字节)>

该结构要求每个标签最多可以包含65534个字节的元数据。对于更大的结构,真实长度值存储在标签数据中,并且多个标签包含整个结构。

评论标签的示例。它包括一个零终止符,但这不是必需的。

FF FE 00 08 48 45 4C 4C 4F 00 - “HELLO”


2
  1. 大多数JPEG段包含2字节的标记(在COM的情况下为0xFFFE),后跟段长度(2字节)。有关更多详细信息,请参见JPEG语法和结构(维基百科)。对于COM标记,您必须指定长度字段。

  2. 只有表格(仅DHT和DQT段)的JPEG是有效的,没有图像数据。我不认为没有表格或图像数据的JPEG是有效的,但至少您不需要图像数据。不确定它有多有用,或者大多数JPEG软件如何解释它......

    只有表格的JPEG的用例是与“缩写流”一起使用(仅具有图像数据,无表格的JPEG),以共享多个图像之间的公共表格。


1
关于软件解释它,我尝试了文件FF D8 FF E0 00 10 4A 46 49 46 00 01 02 00 02 80 02 7F 00 00 FF FE 00 08 48 65 6C 6C 6F 21 FF D9是一堆程序,没有一个以任何方式接受它。许多给出了通用错误,有些说它不是有效的JPEG,而ImageMagick的identify则表示图像数据不足。有趣的是,如果其中一个带有表格,看看是否会改变什么。 - Ethan Chapman
@EthanChapman 实际上,JFIF格式添加了一些额外的限制,我相信你的文件不符合这些限制。FFD8FFFE 00084865 6C6C6F21 FFD9应该就足够了。;-) - Harald K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接