JPEGファイルを90度単位で回転させるためのJavaライブラリがありますが、画像の劣化はありませんか? http://mediachest.sourceforge.net/mediautil/ロスレスJPEG回転(90/180/270度)のJava?
API::私はこの発見
JPEGファイルを90度単位で回転させるためのJavaライブラリがありますが、画像の劣化はありませんか? http://mediachest.sourceforge.net/mediautil/ロスレスJPEG回転(90/180/270度)のJava?
API::私はこの発見
非常にきちんとした、素晴らしい発見! –
@Henryよね、どうすればいいのか教えてください。この画像を使って画像を保存するにはどうしたらいいですか?明らかにこの投稿は私を助けてくれませんか、間違ったやり方をしています – therealprashant
をあなたはそれがすべての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)を使用して、ピクセルごとに新しいイメージに変換してください。
それはデコードして、イメージをエンコードすると、データが失われます。 JPEGは、正しく行われた場合、90度のステップで無損失に回転することができます。 –
これはPNG/GIFでも問題ありませんが、残念なことにJPEGの可逆性はありません。 – Henry
これはロスレスではないと言う理由を理解できませんか?特にこの操作をピクセル単位で行っている場合は? –
:必ずしも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
...
}
私は、SanselanとMediaUtilの両方でEXIF回転タグを取得してテストを実行しましたが、llj.getImageInfo()で上記のMediaUtilアプローチが失敗しました。ステップ(どのEXIFメタデータも見つけられません)では、SanselanアプローチがEXIFメタデータを見つけます。 LLJtranは現代のすべてのJPEGを読むことをサポートしていないようです。 – JeroenHoek
私はギャラリーに保存された画像を見ることができません。まったく同じコードを試してみてください。 – therealprashant
どこにインポートするのが難しいですか?java.awt.Rectangle; 私はウェブでいくつかの瓶を試しましたが、Android Studioで使用することはできません。あなたが輸入した瓶で私を助けることができますか? ありがとう –
あなたが作る場合は、入力と出力の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を同じファイルに繰り返し実行すると、何回繰り返してもイメージが劣化しないことがわかります。
私はイメージを保存し、この方法を使用してギャラリーで見ることができません...してください – therealprashant
Javaではありませんが、http://jpegclub.org/jpegtran/は、ロスレスjpeg rotate(Windows/Linux)用に最適なコマンドラインユーティリティである必要があります – Henry
こんにちは、以下のソリューションを使用している場合は、あなたはできる。私はどこでjava.awt.Rectangleをインポートするのが難しいですか。 私はウェブでいくつかの瓶を試しましたが、Android Studioで使用することはできません。あなたが輸入した瓶で私を助けることができますか? ありがとう –