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

标签 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.

我创建了几张图片,标题除了数据之前都是一样的。以下是一些 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 总是出现在每张图像中?另外,如果有人知道,最后两个字节是什么?我制作了几张单色图像,所有图像都有一个重复序列,从最后两个字节开始,这让我觉得它们一定是某种标题信息。

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

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

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

最佳答案

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

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

紧随其后的是压缩扫描数据。

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

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

关于java - jpeg/jfif 图像扫描开始的最后 2 个字节是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37217640/

相关文章:

java - 如何使用 ResponseBodyAdvice 响应不带双引号的字符串正文数据?

java - 如何使用 java 将 .png 图像附加到 html 文件中?

java - 使用 while 循环返回整数的第一个和最后一个数字

java 8迭代列表并按索引与另一个列表进行比较

python - glib.GError : Error interpreting JPEG image file (Unsupported marker type 0x05) 错误

java - 由于某些图像宽度,写入多 strip JPEG 编码的 TIFF 图像失败

ios - 查找指定文件的扩展文件类型(JPEG 图像、TIFF 图像、...) objective c

java - JNI UnsatisfiedLinkError 问题

ios - UIImageView 已经显示了 "deleted"张图像

optimization - JPEG 优化工具?