2012-02-26 6 views
6

In basso vedrai un'immagine della bella pasticceria chiamata "simit" dalla Turchia. È preso da iPad 2, quindi è un JPEG con dimensioni 720 * 960.javax.imageio.ImageIO è rotto? Importa alcune immagini come ruotate

Picture from iPad 720x960

Il problema è che quando uso javax.imageio.ImageIO.read metodo, l'immagine che le importazioni stranamente è quella di un BufferedImage ruotato a sinistra e diventa 960 * 720.

Ho riprodotto questo nel mio Sun JVM 1.6.0_29 su OS X e Sun JVM 1.6.0_26 su Debian. Ecco il codice:

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

Produce width:960 height:720, e quando salvo l'immagine di output, è ruotato a sinistra, come ho detto prima. Se si desidera riprodurre questo, codice per il download e l'immagine da here ed eseguire i seguenti comandi per costruire e gestire:

javac Main.java && java Main 

NOTA: Si può vedere il JPG in archivio come già ruotato, tuttavia sembra 720 * 960 su OS X, iPad, iPhone e come vedi sopra, viene caricato correttamente su imgur.com. Ed è anche aperto correttamente in Adobe Photoshop, caricato correttamente su Facebook ecc.

Quale potrebbe essere il problema qui?

risposta

9

La foto è stata scattata probabilmente tenendo l'iPad in modalità verticale e quindi contiene informazioni di orientamento EXIF, che ImageIO ignora, ma è possibile utilizzare altre librerie, come Apache Sanselan per gestirlo correttamente.

Quindi l'immagine stessa è 960x720, ma MacOS, ImgUR, Facebook ecc correttamente prendono in considerazione le informazioni EXIF.

E simit sembra delizioso :)

+0

Probabilmente hai ragione. L'ho appena confermato da Exif Viewer http://regex.info/exif.cgi Tuttavia Apache Sanselan afferma chiaramente che NON supporta JPEG. Vergogna su ImageIO, ancora alla ricerca di una soluzione. –

+0

Con Sanselan puoi leggere le informazioni di orientamento EXIF ​​e quindi ruotare la Bitmap che hai letto con ImageIO. Naturalmente una soluzione integrata sarebbe migliore, ma non ho trovato nessuno che sia Java puro ... C'è sempre jMagick se JNI le librerie sono OK –

+1

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

Problemi correlati