【问题标题】:Does ImageIO.read() take EXIF orientation metadata into account?ImageIO.read() 是否考虑 EXIF 方向元数据?
【发布时间】:2018-05-19 07:57:28
【问题描述】:

在 JPEG 图像中,有时会包含 EXIF 元数据,并指示图像应以什么方向显示。

问题是,Java 的ImageIO.read() 在读取 JPEG 图像时是否考虑 EXIF,并自动应用转换。

更具体地说,如果我使用 Java 的 ImageIO 将带有 EXIF 的 JPEG 图像转换为 PNG 图像,那么 PNG 图像的方向是否正确?还是下面的代码会在不考虑 EXIF 方向说明的情况下生成 PNG 图像?

private byte[] convertToPng(byte[] imageFileAsByteArray) {
    ByteArrayInputStream bis = new ByteArrayInputStream(imageFileAsByteArray);
    BufferedImage bi = ImageIO.read(bis);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ImageIO.write(bi, "png", bos);

    return bos.toByteArray();
}

【问题讨论】:

  • ImageIO.read() 不会读取您的 exif。您应该使用ImageReader 类来读取和复制图像元数据
  • 我不想复制任何元数据。 PNG 图像甚至没有任何 EXIF 条目。我想根据 EXIF 值转换图像,然后将其保存为另一种格式,忘记 EXIF 条目
  • 是的,PNG。对不起,我忘了这件事。但无论如何,您必须手动提取元数据并使用它来转换您的图像。这个库也不错:github.com/drewnoakes/metadata-extractor
  • @Uata 你的信息来源是什么。 ImageIO.read() 所做的只是为图像类型构造一个适当的ImageReader,然后调用它。因此很难看出它如何避免处理 EXIF 元数据。

标签: java exif javax.imageio


【解决方案1】:

很遗憾,简短的回答是不; ImageIO.read(..)(默认)不考虑 Exif 方向标签。您的 PNG 将不会相应地旋转。


然而,ImageIO.read(..) 在内部所做的一切就是为输入查找合适的ImageReader 插件,并将读取委托给它。虽然 JRE 捆绑插件不考虑 Exif,但可以在第三方 ImageReader 中添加对它的支持。不幸的是,我不知道有什么,但我正在考虑将来添加Exif orientation support to the TwelveMonkeys ImageIO JPEGImageReader

与此同时,您必须通过读取元数据并旋转来自己应用旋转。可以使用ImageIO JPEG metadata 或一些第三方库来获取方向标签的值。我认为提到的metadata-extractorTwelveMonkeys ImageIO 都可以用于此目的。 JAI ImageIO(使用 TIFF 元数据)可能也可以做到这一点。

如果使用 ImageIO JPEG 元数据,请注意:

请注意,如果应用程序希望在给定 javax_imageio_jpeg_image_1.0 格式的元数据树结构的情况下解释 Exif 元数据,则必须检查带有指示 APP1 标记并包含将其标识为 Exif 标记的数据的标记的 unknown 标记段部分。

【讨论】:

    猜你喜欢
    • 2016-04-12
    • 2014-07-05
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多