【发布时间】:2014-11-03 13:47:27
【问题描述】:
有一个question with the same title,但不幸的是它对我没有帮助。
我正在尝试解析 SOS 标记的数据。我能找到的所有文档都说,在标记 (0xFFDA) 之后是一个两个字节的数字,它定义了这个段的长度——for example here——就像大多数可变大小的标记一样。但在这种情况下,我似乎没有正确理解它。它适用于所有其他标记类型。
我检查了多个文件,但无法正确处理。这个数字是否没有定义完整的 SOS 字段有多长?因此,对于基线 JPEG,应该有一个 SOS 段,之后应该是图像结束标记。如果它是渐进式的,则可以有多个 SOS 段,但仍然都应该有一个长度字段。
我有一张带有SOF0 标记的图片,所以它应该是基线。我相信这是正确的SOFn 标记,因为可以在该标记之后找到图像分辨率。使用十六进制编辑器,我找到了 3 个 0xFFDA 标记,并且它们在接下来的 2 个字节中都有 0x000C。因此,据我了解,该段应始终为 12 字节长。但是在所有 3 种情况下,在 12 个字节的数据之后都没有新的标记。我猜最后一个是我正在寻找的扫描,因为如果出现0xFF 值,则后面跟着0x00——除了重置标记。
0xFFDA 后面的那两个字节不是长度字段吗?
编辑: 因此,多亏了 cmets 和 answer,实际压缩数据似乎没有长度字段,知道它在哪里结束的唯一方法似乎是对其进行解码。
为什么基线 DCT 图像需要多次扫描?我会理解为什么它有两个;主图像和缩略图,但第三次扫描是什么?
但还有一件事。根据 DRI Marker (Define Restart Interval),它包含一个 Scan 应该有一个重新启动标记 0xFFD0 - 0xFFD7 之后的值。但我似乎也误解了这一点,或者我做得不对。例如,标记包含值0x0140 作为重新启动间隔。在下面的扫描中,我从头开始搜索第一个 0xFFD0,但它出现在 862 字节而不是 320 字节之后。
【问题讨论】:
-
FFDA 后面的 2 个字节是长度 (12),但紧跟在 SOS 标记之后的是压缩的图像数据。您需要对数据的“扫描”进行解码,下一个 FFxx 标记将位于压缩数据之后。
-
@BitBank,所以没有字段告诉我压缩数据有多长?
-
压缩后的数据没有长度字段;必须对其进行解码才能找到结尾,或者如果您必须知道结尾在哪里,请在 FFDA 之后查找下一个 FFD9 标记。
-
@BitBank,我已经编辑了我的问题,也许你可以再帮忙一次。
-
基线图像将进行一次扫描。带有缩略图的文件实际上是 2 个 JPEG 图像和 2 个扫描。请发布具有 3 次扫描的示例图像,我会看看。这是我之前关于重启标记的回答:stackoverflow.com/questions/8748671/…
标签: jpeg file-format