在 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-extractor或TwelveMonkeys 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 anunknown
marker segment with a tag indicating anAPP1
marker and containing data identifying it as an Exif marker segment.
关于java - ImageIO.read() 是否考虑 EXIF 方向元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47657302/