Javax.imageio.ImageIO не работает?Импортирует некоторые изображения как повернутые - PullRequest
7 голосов
/ 26 февраля 2012

Ниже вы увидите фотографию красивой выпечки из Турции " simit ".Он взят из iPad 2, поэтому это JPEG с размерами 720 * 960 .

Picture from iPad 720x960

Проблема в том, когда я использую javax.imageio.ImageIO.read метод, изображение, которое он странным образом импортирует, поворачивается в BufferedImage влево и становится 960 * 720 .

Я воспроизвел это в моей Sun JVM 1.6.0_29 на OS X и Sun JVM 1.6.0_26 на Debian.Вот код:

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, и когда я сохраняю это выходное изображение, оно поворачивается влево, как я уже говорил.Если вы хотите воспроизвести это, загрузите код и изображение из здесь и выполните следующие команды для сборки и запуска:

javac Main.java && java Main

ПРИМЕЧАНИЕ: Вы можете увидетьJPG в архиве уже повернут, однако на OS X, iPad, iPhone он выглядит 720 * 960, и, как вы видите выше, он правильно загружен на imgur.com.И он также правильно открывается в Adobe Photoshop, корректно загружается в Facebook и т. Д.

В чем здесь проблема?

1 Ответ

10 голосов
/ 26 февраля 2012

Снимок, вероятно, был сделан с iPad в портретном режиме, и поэтому содержит информацию об ориентации EXIF, которую ImageIO игнорирует, но вы можете использовать другие библиотеки, такие как Apache Sanselan, для правильной обработки.

Таким образом, само изображение имеет размер 960x720, но MacOS, ImgUR, Facebook и т. Д. Правильно учитывают информацию EXIF.

А симит выглядит вкусно :) 1005 *

...