2014-11-03 61 views
4

有一个question with the same title但不幸的是它不能帮助我。解析JPEG SOS标记

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

我检查了多个文件,但不能得到这个权利。这个数字没有定义完整的SOS字段有多长?因此,对于基线JPEG,应该有一个SOS片段,在此之后应该结束图像标记。如果是渐进的,可以有多个SOS段,但仍然都应该有一个长度字段。

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

这两个字节跟在0xFFDA之后不是长度字段吗?

编辑: 所以感谢意见,回答似乎是实际的压缩数据,只知道它在哪里结束似乎对其进行解码方式没有长度字段。

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

但还有一件事。根据DRI标记(定义重新启动间隔),它包含扫描应该有一个重新开始标记0xFFD0 - 0xFFD7之后的值。但我似乎错误地认为,或者我不这样做是正确的。例如,标记包含值0x0140作为重新启动间隔。在下面的扫描中,我从头开始搜索第一个0xFFD0,但后来是862字节而不是320.

+2

FFDA之后的2个字节是长度(12),但紧接在SOS标记之后是压缩图像数据。您需要解码数据的“扫描”,并且下一个FFxx标记将位于压缩数据之后。 – BitBank 2014-11-03 14:06:29

+0

@BBBank,所以没有字段告诉我压缩数据有多长? – ap0 2014-11-03 15:10:06

+0

压缩数据没有长度字段;必须对其进行解码才能找到结尾,或者如果必须知道结束位置,请在FFDA之后查找下一个FFD9标记。 – BitBank 2014-11-03 17:16:32

回答

3

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

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

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

+1

您不必解码数据即可找到SOF标记的结尾。扫描流中的FF。 FFFF表示压缩的FF值(跳过这些值)。 FFD0 - FFD7是重新启动标记。忽略这些。任何其他的FFxx值应该是流中的下一个块。除非你解压缩,重启标记才意味着什么。它们是MCU间隔,而不是字节间隔。 – user3344003 2014-11-04 17:25:40

+0

由于某些原因,这是不正确的,因为可以创建FF作为值和沿。所以如果你使用它,你必须检查更多的信息。 – 2016-03-14 16:35:10

+1

我有一个错误。 FF编码为FF00。这就是你必须检查除重新启动标记之外的所有内容。 – user3344003 2016-03-15 00:16:04