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

时间:2017-12-05 15:34:19

标签: java exif javax.imageio

在JPEG图像中,有时会包含EXIF元数据,并告知图像的显示方向。

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

更具体地说,如果我使用Java的ImageIO将带有EXIF的JPEG图像转换为PNG图像,那么PNG图像的方向是否正确?或者下面的代码是否会产生PNG图像而不考虑EXIF方向指示?

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();
}

1 个答案:

答案 0 :(得分:2)

简而言之,答案是否定的; ImageIO.read(..)(默认情况下)不考虑Exif Orientation标记。您的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元数据的应用程序必须检查unknown标记段,其中的标记指示APP1标记并包含数据将其标识为Exif标记段。

相关问题