2012-02-26 12 views
6

A continuación verá una imagen de pasteles hermosa llamada "simit" de Turquía. Se toma de iPad 2, por lo tanto, es un JPEG con dimensiones 720 * 960.¿Se ha roto javax.imageio.ImageIO? Importa algunas imágenes como rotadas

Picture from iPad 720x960

El problema es que cuando uso javax.imageio.ImageIO.read método, la imagen que importa es extrañamente a un BufferedImage girar a la izquierda y se convierte en 960 * 720.

He reproducido esto en mi Sun JVM 1.6.0_29 en OS X y Sun JVM 1.6.0_26 en Debian. Aquí está el código:

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()); 
    } 
} 

Genera width:960 height:720, y al guardar esta imagen de salida, se gira a la izquierda como le dije antes. Si desea reproducir esto, código de descarga y la imagen de here y ejecute los siguientes comandos para generar y ejecutar:

javac Main.java && java Main 

NOTA: Puede ver el JPG en el archivo como ya se ha girado, sin embargo, parece 720 * 960 en OS X, iPad, iPhone y, como puede ver arriba, se carga correctamente en imgur.com. Y también se abre correctamente en Adobe Photoshop, cargado correctamente en Facebook, etc.

¿Cuál podría ser el problema aquí?

Respuesta

9

La foto probablemente se tomó sosteniendo el iPad en modo vertical, y por lo tanto contiene información de orientación EXIF, que ImageIO ignora, pero puede usar otras bibliotecas, como Apache Sanselan para manejarlo correctamente.

Así que la imagen en sí es 960x720, pero MacOS, ImgUR, Facebook, etc. toman correctamente la información EXIF ​​en cuenta.

Y simit se ve delicioso :)

+0

Probablemente tenga razón. Acabo de confirmarlo desde algún Exif Viewer http://regex.info/exif.cgi Sin embargo, Apache Sanselan indica claramente que NO es compatible con JPEG. Lástima con ImageIO, todavía está buscando una solución. –

+0

Con Sanselan puede leer la información de orientación EXIF, y luego rotar el mapa de bits que ha leído con ImageIO ... Por supuesto, una solución integrada sería mejor, pero no encontré ninguna que sea pura Java ... Siempre hay jMagick si JNI las bibliotecas son correctas –

+1

http://stackoverflow.com/questions/5905868/am-i-making-this-too-complicated-image-rotation –

Cuestiones relacionadas