2009-04-01 28 views
19

JPEGファイルを90度単位で回転させるためのJavaライブラリがありますが、画像の劣化はありませんか? http://mediachest.sourceforge.net/mediautil/ロスレスJPEG回転(90/180/270度)のJava?

API::私はこの発見

+0

Javaではありませんが、http://jpegclub.org/jpegtran/は、ロスレスjpeg rotate(Windows/Linux)用に最適なコマンドラインユーティリティである必要があります – Henry

+0

こんにちは、以下のソリューションを使用している場合は、あなたはできる。私はどこでjava.awt.Rectangleをインポートするのが難しいですか。 私はウェブでいくつかの瓶を試しましたが、Android Studioで使用することはできません。あなたが輸入した瓶で私を助けることができますか? ありがとう –

答えて

-3

をあなたはそれがすべてのSEに組み込まれて、この種のもののために外部ライブラリを必要としません。最も簡単なのは、Graphics2Dオブジェクトのrotate()関数です。例えば

Image rotatedImage = new BufferedImage(imageToRotate.getHeight(null), imageToRotate.getWidth(null), BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics(); 
    g2d.rotate(Math.toRadians(90.0)); 
    g2d.drawImage(imageToRotate, 0, -rotatedImage.getWidth(null), null); 
    g2d.dispose(); 

ロスなし!

また、慎重にしたい場合は、BufferedImage.getRGB(x、y)を使用して、ピクセルごとに新しいイメージに変換してください。

+6

それはデコードして、イメージをエンコードすると、データが失われます。 JPEGは、正しく行われた場合、90度のステップで無損失に回転することができます。 –

+0

これはPNG/GIFでも問題ありませんが、残念なことにJPEGの可逆性はありません。 – Henry

+0

これはロスレスではないと言う理由を理解できませんか?特にこの操作をピクセル単位で行っている場合は? –

6
建物のヘンリーの答えに、ここでのEXIFデータに基づいてロスレスJPEGの回転を実行するために MediaUtilを使用する方法の例です

:必ずしもEXIFデータから、正しく処理されないEXIFデータの問題について

try { 
    // Read image EXIF data 
    LLJTran llj = new LLJTran(imageFile); 
    llj.read(LLJTran.READ_INFO, true); 
    AbstractImageInfo<?> imageInfo = llj.getImageInfo(); 
    if (!(imageInfo instanceof Exif)) 
     throw new Exception("Image has no EXIF data"); 

    // Determine the orientation 
    Exif exif = (Exif) imageInfo; 
    int orientation = 1; 
    Entry orientationTag = exif.getTagValue(Exif.ORIENTATION, true); 
    if (orientationTag != null) 
     orientation = (Integer) orientationTag.getValue(0); 

    // Determine required transform operation 
    int operation = 0; 
    if (orientation > 0 
      && orientation < Exif.opToCorrectOrientation.length) 
     operation = Exif.opToCorrectOrientation[orientation]; 
    if (operation == 0) 
     throw new Exception("Image orientation is already correct"); 

    OutputStream output = null; 
    try { 
     // Transform image 
     llj.read(LLJTran.READ_ALL, true); 
     llj.transform(operation, LLJTran.OPT_DEFAULTS 
       | LLJTran.OPT_XFORM_ORIENTATION); 

     // Overwrite original file 
     output = new BufferedOutputStream(new FileOutputStream(imageFile)); 
     llj.save(output, LLJTran.OPT_WRITE_ALL); 

    } finally { 
     IOUtils.closeQuietly(output); 
     llj.freeMemory(); 
    } 

} catch (Exception e) { 
    // Unable to rotate image based on EXIF data 
    ... 
} 
+0

私は、SanselanとMediaUtilの両方でEXIF回転タグを取得してテストを実行しましたが、llj.getImageInfo()で上記のMediaUtilアプローチが失敗しました。ステップ(どのEXIFメタデータも見つけられません)では、SanselanアプローチがEXIFメタデータを見つけます。 LLJtranは現代のすべてのJPEGを読むことをサポートしていないようです。 – JeroenHoek

+0

私はギャラリーに保存された画像を見ることができません。まったく同じコードを試してみてください。 – therealprashant

+0

どこにインポートするのが難しいですか?java.awt.Rectangle; 私はウェブでいくつかの瓶を試しましたが、Android Studioで使用することはできません。あなたが輸入した瓶で私を助けることができますか? ありがとう –

6

あなたが作る場合は、入力と出力のFileオブジェクトがREFE

final File    SrcJPEG = new File("my-input.jpg"); 
final File    DestJPEG = new File("my-output.jpg"); 
final FileInputStream In  = new FileInputStream(SrcJPEG); 

try { 
    final LLJTran   LLJT = new LLJTran(In); 

    LLJT.read(LLJTran.READ_ALL, true); 
    LLJT.transform(LLJTran.ROT_90); 

    final FileOutputStream Out = new FileOutputStream(DestJPEG); 

    try { 
     LLJT.save(Out, LLJTran.OPT_WRITE_ALL); 
    } finally { 
     Out.close(); 
    } 

} finally { 
    In.close(); 
} 

:多くの状況では無関係で、ここでは(user113215のおかげで)のみLLJTranのロスレスJPEGの回転機能を示すサンプルコードですrを同じファイルに繰り返し実行すると、何回繰り返してもイメージが劣化しないことがわかります。

+0

私はイメージを保存し、この方法を使用してギャラリーで見ることができません...してください – therealprashant

関連する問題