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

在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插件,并将读取委托给它。而且,尽管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标记段的数据。

怎么把JPEG图像转换成TIFF图像? - java

我正在开发一个用于图像处理的应用程序,因为我需要将JPEG文件转换为TIFF文件。我已经尝试了下面的代码片段进行转换。但是,它正在生成损坏的tiff文件。这是代码:package javaapplication2; import java.awt.Color; import java.awt.image.BufferedImage; import java.…

ImageIO.read无法读取ByteArrayInputStream(图像处理) - java

我试图读取图像文件,将其转换为字节数组,处理各个字节,然后将其转换回图像文件并导出。我已经尝试过处理它,但是ImageIO.read似乎无法读取ByteInputArrayStream-它返回null。到目前为止,这是我尝试过的操作(以及引发错误的行)public static void RGBToGrayManual2(BufferedImage orig…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…