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

时间:2016-05-13 19:10:11

标签: java jpeg

从我使用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.

我已经创建了几个图像,并且除了数据之前,标题是相同的。以下是一些标题示例。

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总是在每个图像中?另外,如果有人知道,最后两个字节是什么?我制作了几张单色图像,所有这些都有一个重复的系列,从最后两个字节开始,这让我觉得它们必须是某种标题信息。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

然后是压缩的扫描数据。

显然,您使用的任何编码器始终在交错扫描中编码彩色图像(而不是单独扫描中的每个组件)。

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