Gibt es eine Java-Bibliothek zum Drehen von JPEG-Dateien in Schritten von 90 Grad, ohne Bildverlust?Verlustfreie JPEG-Drehung (90/180/270 Grad) in Java?
Antwort
fand ich dies: http://mediachest.sourceforge.net/mediautil/
API: http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html
sehr gepflegt, toller Fund! –
@Henry hey bitte könntest du mir sagen, wie ich das Bild mit diesem ... speichern kann. Dieser Beitrag hilft mir nicht oder ich mache den falschen Weg. – therealprashant
Sie keine externe Bibliothek für diese Art der Sache brauchen, es ist alles in SE gebaut. Am einfachsten ist die Funktion rotate() des Graphics2D-Objekts.
Zum Beispiel:
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();
kein Verlust!
Oder, wenn Sie besonders vorsichtig sein möchten, verwenden Sie einfach BufferedImage.getRGB (x, y), und übertragen Sie Pixel für Pixel auf das neue Bild.
Das wäre nicht verlustfrei, da du entschlüsseln müsstest. Kodieren Sie das Bild, was zu Datenverlust führt. JPEGs können verlustfrei in 90-Grad-Schritten gedreht werden, wenn sie korrekt ausgeführt werden. –
Das ist gut für PNG/GIF Ich denke, aber leider nicht verlustfrei zu JPEG. – Henry
Ich verstehe nicht, warum Sie sagen würden, dass dies nicht verlustfrei ist? Vor allem, wenn Sie diese Operation Pixel für Pixel machen? –
Aufbauend auf Henrys Antwort, hier ist ein Beispiel dafür, wie MediaUtil verwenden verlustfreie JPEG Rotation auf der Basis der EXIF-Daten auszuführen:
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
...
}
Ich habe einen Test mit dem Abrufen des EXIF-Rotationstags mit Sanselan und MediaUtil ausgeführt, aber der obige MediaUtil-Ansatz schlägt für mich bei der llj.getImageInfo() fehl; Schritt (keine EXIF-Metadaten finden), wo der Sanselan-Ansatz die EXIF-Metadaten findet. Es scheint, dass LLJtran das Lesen aller modernen JPEGs nicht unterstützt. – JeroenHoek
Ich bin nicht in der Lage, das gespeicherte Bild in meiner Galerie zu sehen..versucht den exakt gleichen Code .. – therealprashant
Ich habe Schwierigkeiten zu finden, wo java.awt.Rectangle zu importieren; Ich habe einige Gläser im Web versucht, aber ich kann sie nicht mit Android Studio verwenden. Können Sie mir mit dem Glas helfen, das Sie importiert haben? Danke –
In Bezug auf die Frage der EXIF-Daten müssen nicht unbedingt richtig gehandhabt werden, da EXIF-Daten zeigt Beispielcode ist irrelevant in vielen Situationen, hier ist nur die Funktion LLJTran lossless JPEG Rotation (mit dank user113215):
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();
}
Wenn Sie die Eingabe und Ausgabe File
Objekte machen Refe In derselben Datei können Sie dies immer wieder ausführen und beobachten, dass das Bild nicht beeinträchtigt wird, unabhängig davon, wie viele Iterationen durchlaufen werden.
Ich bin nicht in der Lage, Bild zu speichern und es in der Galerie mit dieser Methode zu sehen ... Bitte helfen Sie – therealprashant
- 1. Verlustfreie Bildrotation
- 2. Verlustbehaftete ODER verlustfreie Zerlegung
- 3. Drehen eines Bildes 90 Grad in Java
- 4. Verlustfreie RGB zu Y'CbCr Umwandlung
- 5. Verlustfreie Zusammenführung von PDFs (PHP)
- 6. On-the-fly verlustfreie Bildkomprimierung
- 7. Grad-Symbol (wie in Grad Celsius/Fahrenheit) in einem TextView
- 8. Drehen Sie eine Matrix um 90 Grad - in Java
- 9. Der beste Weg, um Java-Aufgabe in Grad zu definieren
- 10. Python3 - verlustfreie Komprimierung von langen verschachtelten Listen
- 11. Verlustfreie Drehung von PDF-Dateien mit imagemagick
- 12. LocalBridge Grad k in Graph
- 13. Phonegap - Geräteausrichtung in Grad & Magnetfeld
- 14. Videoansicht drehen 90 Grad in Android
- 15. Kompakte verlustfreie Darstellung von Gleitkommakonstanten in C/C++
- 16. Java: Punkt um einen anderen um den angegebenen Grad drehen
- 17. Wie kann eine verlustfreie JPEG 2000-Komprimierung erkannt werden?
- 18. Java-Code für von Marken zu finden Grad ist falsch
- 19. Drucken Sie einen Schüler Grad, Liste und Brief Grad
- 20. Powershell Grad-Symbol
- 21. Python Grad und Radiant
- 22. UIImage Rotation benutzerdefinierte Grad
- 23. Vertikale Ausrichtung Grad - Android
- 24. Python Numpy: Radiant in Grad in [0360]
- 25. Approximierende Bezierkurven Grad N
- 26. Erkennen 360-Grad-Video
- 27. Wie Prozent Steigung Grad
- 28. Verlustfreie Komprimierung von PNG im Speicher als NSData?
- 29. Grad in Support Vector Regression - RBF Kernel
- 30. Kameraansicht drehen 90 Grad in Swift
nicht in Java, aber http://jpegclub.org/jpegtran/ sollte das beste Kommandozeilen-Dienstprogramm für verlustfreie JPEG-Rotation sein (Windows/Linux) – Henry
Hallo, wenn Sie unter Lösung verwendet haben, würde ich gerne Ihre Hilfe anfordern, wenn Sie können. Ich habe Schwierigkeiten zu finden, wo java.awt.Rectangle zu importieren ist; Ich habe einige Gläser im Web versucht, aber ich kann sie nicht mit Android Studio verwenden. Können Sie mir mit dem Glas helfen, das Sie importiert haben? Danke –