解析JPEG SOS标记

时间:2014-11-03 13:47:27

标签: jpeg

有一个question with the same title但不幸的是它对我没有帮助。

我正在尝试解析SOS标记的数据。我可以找到的所有文档都说在标记(0xFFDA)之后是一个两个字节的数字,它定义了这个段的长度 - for example here - 和大多数可变大小的标记一样。但在这种情况下,我似乎无法正确理解它。它适用于所有其他标记类型。

我检查了多个文件,但却无法做到这一点。这个数字是不是定义了完整的SOS字段有多长?因此对于基线JPEG,应该有一个SOS片段,在此之后应该跟随End of Image标记。如果它是渐进的,则可以存在多个SOS段,但仍然应该具有长度字段。

我有一张带有SOF0标记的图片,所以它应该是基线。我相信这是正确的SOFn标记,因为可以在该标记之后找到图像分辨率。使用十六进制编辑器,我发现3个0xFFDA标记,并且所有标记在后面的2个字节中都有0x000C。因此,据我所知,该段应始终为12字节长。但是在所有3种情况下,在12字节数据之后没有新标记。我想最后一个是我正在寻找的扫描,因为如果值0xFF出现,则后跟0x00 - 除了重置标记。

0xFFDA之后的那两个字节不是长度字段吗?

修改 因此,由于评论和答案,实际压缩数据似乎没有长度字段,只有知道它结束的方式似乎是解码它。

为什么基线DCT图像有多次扫描?我明白为什么它有两个;主图像和缩略图,但第三次扫描是什么?

但还有一件事。根据DRI标记(定义重新启动间隔),它包含扫描应具有重新启动标记0xFFD0 - 0xFFD7的值。但我似乎错过了解或者说我做得不对。例如,标记包含值0x0140作为重启间隔。在下面的扫描中,我从头开始搜索第一个0xFFD0但是它来自862个字节而不是320个。

2 个答案:

答案 0 :(得分:4)

SOS标记包含压缩数据; JPEG流中最复杂的部分。 SOFn标记表示数据的格式。 SOF0和SOF1的处理方式相同。 SOF2(渐进式)有点不同。 (SOFn标记的读取不常用或普遍支持)。

长度是SOS标头的长度,而不是压缩数据。大多数标题仅适用于逐行扫描(SOF2)。

压缩数据在标题后面。压缩数据没有长度。您必须扫描数据才能找到下一个标记。

答案 1 :(得分:3)

如何找到SOS标记(0xFFDA)之后的下一个标记的摘要

  1. 跳过SOS标记后的前3个字节(2个字节的标头大小+ 1个字节的扫描图像分量)。
  2. 搜索下一个FFxx标记(每FF00 跳过,范围从FFD0FFD7,因为它们是扫描的一部分)。< / li>

*这是{user https://www.w3.org/Graphics/JPEG/itu-t81.pdf}中user3344003 +我的知识+表B.1下方的评论摘要。

*基于表B.1,我还怀疑在第2点中也应跳过值FF01FF02FFBF,但是我不确定它们是否不能显示为编码的SOS数据的一部分。


上面的其他问题:

  

为什么基准DCT图像具有多次扫描?我会理解为什么它有两个。主图像和缩略图,但是第三次​​扫描是什么?

如果图像流包含APP2标记(0xFFE2),这告诉我们它可以是(但不一定是)多图片JPEG(标记为MPF),则我们可以拥有3张以上的图像。通常,APP标记可以存储任何内容,在JPEG文件中有许多与APP段有关的标准。

第一个表向我们介绍了可以存储在每个APP段中的“事物”:https://sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html