在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();
}
答案 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-extractor或TwelveMonkeys ImageIO都可以用于此目的。 JAI ImageIO(使用TIFF元数据)也可能会这样做。
如果使用ImageIO JPEG元数据,请注意:
请注意,希望在
javax_imageio_jpeg_image_1.0
格式下给出元数据树结构来解释Exif元数据的应用程序必须检查unknown
标记段,其中的标记指示APP1
标记并包含数据将其标识为Exif标记段。