jpeg/jfif 图像扫描开始的最后 2 个字节是什么

What are the last 2 bytes in the Start of Scan of a jpeg/jfif image

正在从我使用 Java 创建的 JFIF 图像中收集信息:

Image bmp = ImageIO.read(new File("Background1.png"))
        .getScaledInstance(624, 416, Image.SCALE_SMOOTH);

BufferedImage tmpBufferedImage = new BufferedImage(bmp.getWidth(null), bmp.getHeight(null),
        BufferedImage.TYPE_USHORT_565_RGB);
Graphics2D g = tmpBufferedImage.createGraphics();
g.drawImage(bmp, 0, 0, null);
g.dispose();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(tmpBufferedImage, "jpg", baos);

.... Written to file later.

我创建了几张图片,header除了数据之前是一样的。这里有一些 header 个例子。

FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F3 EA
FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F7 FA
FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 E2 E8
FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F9 FE

这些后面是压缩数据,并以 FF D9 结尾。

根据我在 JPEG/JFIF 上阅读的所有内容,FF DA 之后的所有内容都应该是压缩数据,但为什么 00 0C 03 01 00 02 11 03 11 00 3F 00 总是出现在每个图像中?另外,如果有人知道,最后两个字节是什么?我制作了几张单色图像,所有图像都有一个重复序列,从最后两个字节开始,这让我觉得它们一定是某种 header 信息。

问题:那 12 个字节 (0C...00) 是什么,特别是最后 2 个字节是什么?

更新:所以这些字节被称为扫描开始,我找到了一些文档。 00 0C 是一个长度 (12),因为它加起来是有问题的字节数。关于接下来的 8 个字节左右,还有一些其他信息,但最后一个我仍然不确定。

最后:这是一个兔子洞,但我将留下这个问题,以防有人追逐同一只兔子。末尾的两个字节是扫描数据的一部分,因为 00 0c 显然包含在 12 个字节的计数中。这是另一位用户在另一个问题上指出的。

您需要查看 SOS 标记的布局。

  • FFDA 表示 SOS 标记。
  • 00OC 是标记长度 = 12
  • 3 = 是分量数。 接下来是分配给扫描的扫描 ID、霍夫曼和量化表。

后面是压缩扫描数据。

显然,无论您使用什么编码器,总是在交错扫描中对彩色图像进行编码(而不是在单独扫描中对每个分量进行编码)。

FFD9 是一个 EOI 标记,表示 JPEG 流的结尾。