JPG drehen, skalieren und speichern

Status
Nicht offen für weitere Antworten.

Sandforelle

Mitglied
Hallo zusammen,

ich bin das erste Mal hier im Forum und hoffe ihr könnt mir helfen.

Ich bin noch dabei Java zu lernen und habe mir das Ziel gesetzt endlich eine lange gewolltes Programm fertig zu bekommen.
Ich will Bilder (JPG) drehen, dann skalieren (verkleinern) und anschließend ohne Kompression speichern. Alles ohne Sie anzuzeigen.
Habe mir dazu auch schon einiges zusammengesucht aber so richtig funktioniert es nicht.

Das drehen des Bildes funktioniert prima.
Code:
//Bild drehen
	BufferedImage inputImage = ImageIO.read(new File( "C:/IMG_0001.jpg" )); 
    new RotateImage( 90 ); // current Angle
    BufferedImage rotatedImage = rotateImage(inputImage);
    ImageIO.write(rotatedImage,"JPG",new File("C:/rot.jpg"));
    //---------------------

Das skalieren nur noch so halb.
Ich bekomme zwar ein Bild mit der richtigen Größe, es ist aber leer (bzw. grau :bahnhof: ).
Code:
//Bild skalieren
    BufferedImage scaledImage = new BufferedImage(2048, 3072, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = scaledImage.createGraphics();
    AffineTransform at = AffineTransform.getScaleInstance((double)2048,(double)3072);
    g.drawRenderedImage(rotatedImage,at);
    ImageIO.write(scaledImage,"JPG",new File("C:/rot_skal.jpg"));
    //-----------------------

Die dann folgende Einstellung der Kompression funktioniert wieder.
Das endgültig Bild ist dann durch das fehlerhafte Ergebnis der Skalierung ebenfalls leer.
Code:
//Compression einstellen
    Iterator iterator = ImageIO.getImageWritersBySuffix("jpeg");
    ImageWriter imageWriter = (ImageWriter) iterator.next();
    JPEGImageWriteParam imageWriteParam = new JPEGImageWriteParam(Locale.getDefault());
    imageWriteParam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
    imageWriteParam.setCompressionQuality(1.0F);
    
    //Speichern
    IIOImage iioImage = new IIOImage(scaledImage, null, null);
    imageWriter.setOutput(ImageIO.createImageOutputStream(new File("C:/rot_skal_comp.jpg")));
    imageWriter.write(null, iioImage, imageWriteParam);
    //--------------------------------------

Habt ihr eine Idee wo es dabei hakt ???

Vielen Dank

Sandforelle
 

Marco13

Top Contributor
AffineTransform at = AffineTransform.getScaleInstance((double)2048,(double)3072);

Lass mich raten: Der obere, linke Pixel deines Bildes ist grau? :wink:
Was dort angegeben ist, sind Faktoren, und nicht die gewünschte Zielgröße.

AffineTransform at = AffineTransform.getScaleInstance(2,0.5);
Macht das Bild doppelt so breit und halb so hoch wie vorher.
 

Sandforelle

Mitglied
Ich arbeite ja überall mit BufferdImage.

Ich habe es nicht hinbekommen ein BufferedImage in ein Image zu ändern und dann Image.getScaledInstance anzuwenden.

Leider hab ich von der ganzen Materie auch nocht nicht so die Ahnung.
 

The_S

Top Contributor
Du kannst einfach BufferedImage#getScaledInstance aufrufen. Dazu brauchst du kein Image, da BufferedImage von Image erbt.
 

Sandforelle

Mitglied
OK,

ich habe also ein BufferedImage namens rotatedImage.
Code:
 BufferedImage rotatedImage = rotateImage(inputImage);
Dieses will ich nun verkleinern.

Dann schreibe ich den Code mit meinen bescheidenen Kenntnissen um in:
Code:
int wNew = 2048, hNew = 3072;

	BufferedImage scaledImage = rotatedImage.getScaledInstance(wNew, hNew, BufferedImage.SCALE_SMOOTH);
	BufferedImage outImg = new BufferedImage(wNew, hNew, BufferedImage.TYPE_INT_RGB);
	Graphics g = outImg.getGraphics();
	g.drawImage(scaledImage, 0, 0, null);
	g.dispose();

	
	ImageIO.write(scaledImage,"JPG",new File("C:/rot_skal.jpg"));

Allerdings bekomme ich in der Zeile von rotatedImage.getScaledInstance die Meldung, das eine Konvertierung von Image auf BufferedImage nicht möglich ist.

Irgendeine Idee was ich falsch mache ??
 

Marco13

Top Contributor
Sandforelle hat gesagt.:
Eigentlich nicht.

Die Größe des Bildes stimmt.
Es sind 2048*3072 Pixel und alles ist grau.

?????
DU hast ein Bild der Größe 2048*3072 Pixel. Und das wird mit den Faktoren 2048 und 3072 skaliert. Was rauskommt, wäre ein Bild der Größe 4 Millionen x 9.4 Millionen. Hm :?
 

Sandforelle

Mitglied
Ich habe ein Bild mit 2304*3456 Pixel und das ist zu 2048*3072 geworden.

Ich habe mir nach deinem Hinweis die Syntax noch mal angeschaut.
Es sind wirklich Faktoren!
Frag mich bitte nicht wieso das Bild die richtigen Dimensionen hat ?!?!
 

Marco13

Top Contributor
Das BufferedImage, das du erstellst, hat die angegebene Größe. Aber das, was dort reingezeichnet wird, ist mit diesen Faktoren skaliert. D.h. der obere, linke Pixel deines Eingabe-Bildes wird 2048x3072 Pixel groß gezeichnet, und füllt damit den gesamten Bereich des BufferedImages, wo er reingezeichnet wird. Und er IST grau, gell? :wink:
 

Sandforelle

Mitglied
Danke für den Tipp, es funktioniert jetzt :O).

Allerdings sieht das Bild etwas sehr "verpixelt" aus.
Linien sind nicht mehr glatt.

Gibts da noch eine andere Variante das bild zu drehen und zu skalieren eventuelle über das angedeutete BufferdImage.getScaltedInstance anstatt AffinTramsform.

Danke nochmals
 

The_S

Top Contributor
Mit getScaledInstance kannst du angeben wie skalliert werden soll (fein, schnell, ...). Du kannst auch erstmal rausfinden ob der Qualitätsverlust am skalieren oder am rotieren liegt.
 
G

Gast

Gast
Vielen Daaaaank !!

Die Tipps haben mich endlich ans Ziel gebracht.

Folgender Code hats gerichtet:
Code:
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

Danke ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
N Bild drehen Java Basics - Anfänger-Themen 3
R Java ImageIcon drehen Java Basics - Anfänger-Themen 6
R Image drehen Java Basics - Anfänger-Themen 1
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
I String um 90 Grad drehen Java Basics - Anfänger-Themen 17
B Erste Schritte Drehen in Graphics2d Java Basics - Anfänger-Themen 2
K Quadratische Matrix um 90° drehen Java Basics - Anfänger-Themen 5
P Vektor im R3 drehen? Java Basics - Anfänger-Themen 14
O BufferedImage drehen, falsch positioniert Java Basics - Anfänger-Themen 5
A Array drehen Java Basics - Anfänger-Themen 2
S Drehen RGB Würfel Java Basics - Anfänger-Themen 18
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
L Array drehen Java Basics - Anfänger-Themen 8
S Drehen eines Pfeils im Flug Java Basics - Anfänger-Themen 10
F Bild drehen Java Basics - Anfänger-Themen 9
A Javaspiel im Handy mit Drehen Java Basics - Anfänger-Themen 12
A Grafik2d Objekte drehen, Idee da, Problem in Umsetzung Java Basics - Anfänger-Themen 3
A Denkanstoß: Drehen eines Bildes (Matrix) Java Basics - Anfänger-Themen 5
D Image drehen Java Basics - Anfänger-Themen 6
S Zeichnung drehen Java Basics - Anfänger-Themen 13
H Drehen von Label Java Basics - Anfänger-Themen 2
R 2dimensionales array um 90 grad drehen Java Basics - Anfänger-Themen 2
T Bild drehen + richtige größe berechnen Java Basics - Anfänger-Themen 4
J Kann man ein JFrame/JWindow 90/-90 drehen? Java Basics - Anfänger-Themen 9
B array drehen Java Basics - Anfänger-Themen 11
G Aufgabe rekursiv Zahlen drehen Java Basics - Anfänger-Themen 5
P ImageIcon zusammen mit Fenstergrösse skalieren Java Basics - Anfänger-Themen 3
J Java Array Zeichnung Skalieren und verschieben Java Basics - Anfänger-Themen 5
P JavaFX - Komponenten skalieren Java Basics - Anfänger-Themen 16
Sogomn Bild will sich nicht skalieren lassen Java Basics - Anfänger-Themen 1
F Skalieren eines ImageIcons Java Basics - Anfänger-Themen 9
M bild skalieren Java Basics - Anfänger-Themen 5
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
Spin Image skalieren Java Basics - Anfänger-Themen 2
C Hintergrundbild im JFrame skalieren Java Basics - Anfänger-Themen 2
J Bilderschau Bild Skalieren Java Basics - Anfänger-Themen 17
K Foto skalieren Java Basics - Anfänger-Themen 3
N Skalieren von ZEichenfläche/Koordinatenkreuz umlegen Java Basics - Anfänger-Themen 4
G Icons für JTree skalieren? Java Basics - Anfänger-Themen 3
G Graphics-Object skalieren Java Basics - Anfänger-Themen 9
B Bild skalieren Java Basics - Anfänger-Themen 7
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
I Historisierung - Alter Wert, Neuer Wert... wie speichern? Java Basics - Anfänger-Themen 44
berserkerdq2 Wie datum im default format speichern? Java Basics - Anfänger-Themen 5
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
C XML Datei speichern und laden Java Basics - Anfänger-Themen 18
Marlena Bauer Konsolenausgabe in .txt speichern Java Basics - Anfänger-Themen 6
B JaxB - Property vom Typ Object und LocalDateTime speichern? Java Basics - Anfänger-Themen 0
ansystin Teilerfremde Zahlen ausgeben + Zahlenausgabe speichern Java Basics - Anfänger-Themen 3
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
C File speichern Java Basics - Anfänger-Themen 5
D String und char in String speichern Java Basics - Anfänger-Themen 5
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
B JaxB - speichern vom Typ "Object" Java Basics - Anfänger-Themen 8
GermanPie Nachrichten Speichern Java Basics - Anfänger-Themen 2
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
C Wo Defaultpfad speichern? Java Basics - Anfänger-Themen 2
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
Dimax stream in string[] speichern Java Basics - Anfänger-Themen 6
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
I ArrayList - Methode zum Speichern eines Eintrags in einer Datei Java Basics - Anfänger-Themen 17
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben