java - ImageIO.read() 是否考虑 EXIF 方向元数据?

标签 java exif javax.imageio

在 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 Orientation 标签。您的 PNG 将不会相应地旋转。

<小时/>

但是,ImageIO.read(..) 在内部执行的所有操作都是为输入查找适当的 ImageReader 插件,并将读取委托(delegate)给它。虽然 JRE 捆绑的插件不考虑 Exif,但可以在第三方 ImageReader 中添加对它的支持。不幸的是,我不知道有任何这样做,但我正在考虑添加 Exif orientation support to the TwelveMonkeys ImageIO JPEGImageReader将来。

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

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

Note that an application wishing to interpret Exif metadata given a metadata tree structure in the javax_imageio_jpeg_image_1.0 format must check for an unknown marker segment with a tag indicating an APP1 marker and containing data identifying it as an Exif marker segment.

关于java - ImageIO.read() 是否考虑 EXIF 方向元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47657302/

相关文章:

java - 保存/恢复 Android 应用程序实例状态的稳健且简单的方法

java - Jackson 中的序列化数组类型和数组

.net - .Net 最好的 EXIF 库是什么?

java - JPEGImageWriteParam 抛出 ClassCastException

java - 使用 Java Reflection API 在不知道类型的情况下转换枚举

java - Antlr 语义谓词

image - 如何从图像中删除 EXIF 数据,但保持方向?

R将EXIF数据写入JPEG文件

resize - 使用 imgscalr 调整 .tif 图像的大小

java - 与原始图像文件相比,ImageIO 写入产生不同的文件大小