Rotate BufferedImage --> Bild unvollständig

Status
Nicht offen für weitere Antworten.

ChristianS

Mitglied
Hallo, ich möchte bei einem selbstgeschriebenen Bildbetrachter die Möglichkeit implementieren das angezeigte Bild in 90° schritten nach links oder rechts zu drehen. Habe dazu auch einige Threads gefunden und nun eine Funktion implementiert, die das erledigt. Jedoch schneidet mir diese Funktion beim rotieren einen Rand des Bildes ab.

Hier mal die implementierte Funktion für eine drehung um 90 grad nach links:

Code:
protected void rotiereLinks(){
		AffineTransform atf = new AffineTransform();	
		atf = AffineTransform.getRotateInstance(Math.toRadians(ALPHA_LINKS),	//Rotation als Affine Transformation
				(getImage().getWidth()/2),										//im Winkel -90° um den Bildmittelpunkt
				(getImage().getHeight()/2));									
		AffineTransformOp op = new AffineTransformOp(atf,AffineTransformOp.TYPE_BILINEAR); 
		BufferedImage tmp = new BufferedImage(getImage().getHeight(),          //temporäres Objekt mit vertauschten
				  							  getImage().getWidth(), //Seitenverhältnissen
				  							  getImage().getType());
		tmp = op.filter(getImage(),null);	// temporäres Imageobjekt, dem das durch den Filter transformierte
		setImage(tmp);						// ImageObjekt zugewiesen wird, setzten des neuen Images
		repaint();							// und repaint()
				
	}


Habe das ganze auch schon mithilfe eines Graphics2d-Objektes versucht, jedoch mit dem selben ergebniss, je nachdem in welche richtung ich drehe, fehlt entwerde der linke oder der rechte Rand.
Hoffe mir kann jmd einen denkanstoss in die richtige Richtugn geben.
 

ChristianS

Mitglied
Super. Dies PaintComponentMethode klappt perfekt... Vielen vielen Dank.
Nachdem ich mir jetzt aber den ganzen Nachmittag mit den verschiedenen Transformationen (AffineTransform, AffineTransformOp und Graphics2D um die Ohren gehauen habe würde ich gerne verstehen, warum meine Lösung nicht klappte.

Die korrekte Lösung versteh ich nicht so ganz, ich weiß zwar, was in den einzelnen Zeilen passiert, aber die Unterschiede zu meiner Lösung sind mir nicht klar.

1. warum wird zuerst
Code:
 super.paintComponent(g);
aufgerufen?


2.Was ist der Unterschied zwischen dieser erzeugung eines Graphics2D-Objektes
Code:
Graphics2D g2d = (Graphics2D)g;
und der von mir gewählten
Code:
Graphics2D g2d = getImage().createGraphics();
es wird doch in beiden Fällen ein graphics2D objekt von einem BufferedImage erzeugt, oder ?


und warum nutzt diese Lösung 2 AffineTransfom-Objekte??
Code:
AffineTransform origXform = g2d.getTransform();
AffineTransform newXform = (AffineTransform)(origXform.clone());

Eins um die Transformation durchzuführen, newXForm, aber warum behält man sich die Ursprüngliche TransfomationsMatrix im Speicher und setzt g2d am schluss wieder darauf zurück????


Wie gesagt, vielen vielen Dank erstmal, für die Lösung. Das Forum hat mir bis jetzt schon sehr weitergeholfen. Hoffe das meine Fragen nicht allzu "dumm" sind, aber bis jetzt tue ich es mir leider bei der Gui-Programmierung noch recht schwer.
 

André Uhres

Top Contributor
super.paintComponent(g); bereinigt das Offscreenbild. Ohne diese Anweisung kann es vorkommen,
daß das Bild nicht sauber angezeigt wird.
Graphics2D g2d = (Graphics2D)g; erzeugt kein neues Objekt, sondern castet lediglich das Graphics Objekt
vom JPanel.
Da das "newXform" ausschliesslich der Drehung des Bildes dient, setze ich danach das Original wieder zurück,
um zu verhindern, daß später ungewollt noch was anderes "verdreht" wird.
 

ChristianS

Mitglied
Ok. Mein Image wird in einer ImageComponentklasse verwaltet. Abgeleitet von JComponent.
Mit deiner Lösung wurde also ein Graphics2D-Objekt vom Graphics-Objekt der ganzen JComponent gecastet. während bei meinem Ansatz ein neues G2D-Objekt erzeugt wurde, jedoch nur vom Klassenattribut image() durch .createGraphics(). Könnte darin schon der Fehler liegen, dass bei mir die Ränder abgeschnitten wurden durch evtl fehlende Informationen?

Das mit dem super.paintComponent(g) werde ich versuchen noch ein wenig tiefergehend im Forum oder in Java ist auch eine Insel nachzulesen. Ein Phenomen, das am Anfang auftauchte war, dass das Bild zwar gedreht wurde, aber am Rande des neuen Bildes mit neuen Dimensionen noch ausschnitte des alten, nicht gedrehten Bilds zu sehen waren. Könnte das zum Bsp eine solche "unsaubere" Anzeige gewesen sein?
 

Chris_1980

Bekanntes Mitglied
ChristianS hat gesagt.:
Das mit dem super.paintComponent(g) werde ich versuchen noch ein wenig tiefergehend im Forum oder in Java ist auch eine Insel nachzulesen. Ein Phenomen, das am Anfang auftauchte war, dass das Bild zwar gedreht wurde, aber am Rande des neuen Bildes mit neuen Dimensionen noch ausschnitte des alten, nicht gedrehten Bilds zu sehen waren. Könnte das zum Bsp eine solche "unsaubere" Anzeige gewesen sein?

jep, genau.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M rotate Text wird verschoben angezeigt? AWT, Swing, JavaFX & SWT 23
M image rotate, bild nicht mehr zu sehen AWT, Swing, JavaFX & SWT 9
I Arbeitsspeicherverbrauch BufferedImage.TYPE_INT_RGB vs. TYPE_3BYTE_BGR AWT, Swing, JavaFX & SWT 6
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
D BufferedImage -> Feature Extraktion. Unterschiedliche BufferedImage imageTypes problem AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
M 2D-Grafik LookupOp Operation auf BufferedImage AWT, Swing, JavaFX & SWT 7
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
P BufferedImage schlechte Qualität beim Abspeichern AWT, Swing, JavaFX & SWT 9
S BufferedImage als schwarz-weiß-Bild AWT, Swing, JavaFX & SWT 3
Luk10 BufferedImage[...].getData() vs BufferedImage.setRGB() AWT, Swing, JavaFX & SWT 2
D Schnelles kopieren von Pixeln in ein BufferedImage AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
P BufferedImage auf JPanel AWT, Swing, JavaFX & SWT 11
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
0x7F800000 2D-Grafik int[] zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 27
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
E BufferedImage Alphaknal ein- und ausblenden AWT, Swing, JavaFX & SWT 7
N BufferedImage zeichnen AWT, Swing, JavaFX & SWT 4
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
E AWT RenderedImage aus BufferedImage erzeugen, um Bild abzuspeichern? AWT, Swing, JavaFX & SWT 4
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik BufferedImage wird nicht eingezeichnet AWT, Swing, JavaFX & SWT 3
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
J AWT BufferedImage to 2DArray AWT, Swing, JavaFX & SWT 10
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
J JPanel in Bufferedimage AWT, Swing, JavaFX & SWT 3
1 BufferedImage in byte[], dann in String und zurück AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
C BufferedImage-Fehler? Falsches Bild wir gezeichnet AWT, Swing, JavaFX & SWT 5
B BufferedImage Builder AWT, Swing, JavaFX & SWT 15
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
F Größe von BufferedImage ändern AWT, Swing, JavaFX & SWT 27
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
2 Memory Leak mit BufferedImage !! AWT, Swing, JavaFX & SWT 15
X BufferedImage maximiert in JFrame anzeigen? AWT, Swing, JavaFX & SWT 2
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
R Zeichnen von Zahlen in BufferedImage AWT, Swing, JavaFX & SWT 6
G BufferedImage.getRGB() mit 3 int-Werten vergleichen AWT, Swing, JavaFX & SWT 2
Luma BufferedImage wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
S BufferedImage & Scaling: Altes Problem im neuen Gewand AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
G BufferedImage und jpg --> maximale Qualität AWT, Swing, JavaFX & SWT 9
F HTML Text irgendwie auf BufferedImage bringen AWT, Swing, JavaFX & SWT 3
R BufferedImage Problem AWT, Swing, JavaFX & SWT 2
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
? ActionListener auf BufferedImage AWT, Swing, JavaFX & SWT 11
M BufferedImage mit html interpretierten String beschriften AWT, Swing, JavaFX & SWT 3
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
B Farbtiefe eines BufferedImage verringern AWT, Swing, JavaFX & SWT 3
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
F Animiertes Gif als BufferedImage AWT, Swing, JavaFX & SWT 10
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
U Streifen hinter bewegtem BufferedImage AWT, Swing, JavaFX & SWT 13
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
T BufferedImage verkleinern Resultat ist zu pixelig. AWT, Swing, JavaFX & SWT 6
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
B BufferedImage aus einer Datei AWT, Swing, JavaFX & SWT 4
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2
J Image to BufferedImage AWT, Swing, JavaFX & SWT 5
T BufferedImage kopieren AWT, Swing, JavaFX & SWT 3
T BufferedImage Farbe "Transparent" AWT, Swing, JavaFX & SWT 21
T BufferedImage + bestimmten bereich ausfüllen AWT, Swing, JavaFX & SWT 3
M BufferedImage Größe? AWT, Swing, JavaFX & SWT 10
U Löschen eines BufferedImage AWT, Swing, JavaFX & SWT 7
J Image aus BufferedImage ohne AWT AWT, Swing, JavaFX & SWT 5
V Image in BufferedImage AWT, Swing, JavaFX & SWT 3
J BufferedImage aus byte-Array erstellen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben