在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文件。我已经尝试了下面的代码片段进行转换。但是,它正在生成损坏的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…