2012-02-26 7 views
6

以下、トルコの「simit」という美味しいペストリーの画像が表示されます。それはiPad 2から撮影されたものなので、寸法は720 * 960のJPEGです。javax.imageio.ImageIOは壊れていますか?回転した画像を取り込みます

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を出力し、私は、この出力画像を保存するとき、私は前に言ったように、それは左に回転させられます。しかし、それが表示され、あなたは既に回転アーカイブにJPGが表示されることがあります

javac Main.java && java Main 

注:あなたがビルドして実行するhereからこの、ダウンロードコードや絵を再現し、次のコマンドを実行したい場合OS X、iPad、iPhone上の720 * 960で、上記のようにimgur.comに正しくアップロードされています。また、Adobe Photoshopでも正しく開かれ、Facebookに正しく​​アップロードされています。

ここで問題が発生する可能性はありますか?

答えて

9

写真はおそらくiPadをポートレートモードで撮影したため、ImageIOが無視するEXIFの向き情報が含まれていますが、Apache Sanselanのような他のライブラリを使用して正しく処理できます。

画像自体は960x720ですが、MacOS、ImgUR、FacebookなどはEXIF情報を正しく考慮しています。

そしてsimitはおいしく見えます:)

+0

おそらく正しいでしょう。私はちょうどいくつかのExifビューアhttp://regex.info/exif.cgiからそれを確認しました。しかし、Apache SanselanはJPEGをサポートしていないことを明確に述べています。 ImageIOに恥をかけて、まだ解決策を探している。 –

+0

Sanselanを使用すると、EXIFの方向情報を読み取って、ImageIOで読み取ったビットマップを回転させることができます。もちろん、統合ソリューションは優れていますが、純粋なJavaは見つかりません... JNIライブラリはOK –

+1

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

関連する問題