【问题标题】:Is javax.imageio.ImageIO broken? It imports some images as rotatedjavax.imageio.ImageIO 坏了吗?它导入一些旋转的图像
【发布时间】:2012-03-16 05:43:00
【问题描述】:

您将在下面看到一张来自土耳其的名为“simit”的精美糕点图片。它取自 iPad 2,因此它是尺寸为 720*960 的 JPEG。

问题是,当我使用javax.imageio.ImageIO.read 方法时,它奇怪地导入的图像是向左旋转的BufferedImage 并变为960*720。

我在 OS X 上的 Sun JVM 1.6.0_29 和 Debian 上的 Sun JVM 1.6.0_26 中重现了这一点。代码如下:

public class Main {
    public static void main(String[] args) throws Exception {
        FileInputStream stream = new FileInputStream(new File("IMG_0159.JPG"));
        BufferedImage img = ImageIO.read(stream);
        System.out.println("width:" + img.getWidth() + " height:"
                + img.getHeight());
    }
}

它输出width:960 height:720,当我保存这个输出图像时,它会像我之前所说的那样向左旋转。如果你想重现这个,请从here 下载代码和图片并运行以下命令来构建和运行:

javac Main.java && java Main

注意:您可能会看到存档中的 JPG 已旋转,但在 OS X、iPad、iPhone 上显示为 720*960,并且如上所示,它已正确上传到 imgur。 com。并且在 Adob​​e Photoshop 中也正确打开,正确上传到 Facebook 等。

这可能是什么问题?

【问题讨论】:

    标签: java jpeg javax.imageio


    【解决方案1】:

    该照片可能是手持 iPad 以纵向模式拍摄的,因此包含 EXIF 方向信息,ImageIO 会忽略该信息,但您可以使用其他库(如 Apache Sanselan)来正确处理它。

    所以图像本身是 960x720,但 MacOS、ImgUR、Facebook 等正确地考虑了 EXIF 信息。

    而且 simit 看起来很好吃 :)

    【讨论】:

    • 你可能是对的。我刚刚从一些 Exif 查看器regex.info/exif.cgi 确认了它,但是 Apache Sanselan 明确声明它不支持 JPEG。对 ImageIO 感到羞耻,仍在寻找解决方案。
    • 使用 Sanselan 您可以读取 EXIF 方向信息,然后旋转您使用 ImageIO 读取的位图。当然集成解决方案会更好,但我发现没有纯 Java 的解决方案。 . 如果 JNI 库没问题,总有 jMagick
    • 我使用 metadata-extractor 读取元数据,我认为这是一个很好的解决方案:github.com/drewnoakes/metadata-extractor/wiki com.drewnoakesmetadata-extractor2.7.2
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多