2012-02-26 22 views
6

下面您將看到一張來自土耳其的名爲「simit」的美麗糕餅圖片。它取自iPad 2,因此它是尺寸爲720 * 960的JPEG。javax.imageio.ImageIO是否損壞?它以旋轉的方式輸入一些圖像

Picture from iPad 720x960

的問題是,當我使用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。它也在Adobe Photoshop中正確打開,正確上傳到Facebook等。

這裏有什麼問題?

回答

9

該照片很可能是在縱向模式下保存了iPad,因此包含了EXIF方向信息,ImageIO忽略了這些信息,但您可以使用其他庫,如Apache Sanselan來正確處理它。

因此,圖像本身是960x720,但MacOS,ImgUR,Facebook等正確地把EXIF信息考慮在內。

而simit看起來很好吃:)

+0

你可能是對的。我剛剛從一些Exif查看器中確認它http://regex.info/exif.cgi然而,Apache Sanselan明確指出它不支持JPEG。對ImageIO感到羞恥,仍在尋找解決方案。 – 2012-02-26 15:10:06

+0

隨着Sanselan,你可以閱讀EXIF的方向信息,然後旋轉你用ImageIO讀過的位圖。當然,一個集成的解決方案會更好,但我找不到任何是純Java的...總是有jMagick,如果JNI庫是好的 – 2012-02-26 16:34:34

+1

http://stackoverflow.com/questions/5905868/ami-i-making-this-too-complicated-image-rotation – 2012-02-26 17:07:09