Rotation von BufferedImage (Affine Transformation)

Status
Nicht offen für weitere Antworten.

Pannekuche

Mitglied
Hallo Leute!

Ich habe ein kleines Problemchen beim Rotieren von Bildern. Ich drehe Bilder mithilfe der Klasse AffineTransform. Ich will das Bild nur rechts-, links-, und um 180° drehen. Auf den Kopf stellen (also 180°) funktioniert ohne Probleme, jedoch wenn ich das Bild links- oder rechtsdrehe, scheidet er immer ein Stück vom Bild ab. Ich habe das Buch "Java 2D Api Graphics" von Sun besorgt in dem es recht gut erklärt ist. Ich kann jedoch den Fehler nicht finden. Es wird auch kein temporäres Bild angelegt, sondern das neue Bild direkt in das Alte "gerendert" (mit Hilfe der Filter-Methode).

Hier der Code:
"img" ist ein BufferedImage-Objekt

Code:
AffineTransform rotation = new AffineTransform();
AffineTransformOp rotator;
rotation.rotate(Math.toRadians(ROTATERIGHT), img.getWidth() / 2, img.getHeight() / 2);
rotator = new AffineTransformOp(rotation, AffineTransformOp.TYPE_BILINEAR);
img = rotator.filter(img, null);


In dem Buch steht geschrieben, dass die "filter-Methode" die Groesse des neuen Bildes automatisch bestimmt...
Ich habe es auch schon versucht ein neues Bild zu erstellen, dh

Code:
AffineTransform rotation = new AffineTransform();
AffineTransformOp rotator;
BufferedImage tmp = new BufferedImage(img.getHeight(), img,getWidth(), img,getType()); //width und height sind extra vertauscht
rotation.rotate(Math.toRadians(ROTATERIGHT), img.getWidth() / 2, img.getHeight() / 2);
rotator = new AffineTransformOp(rotation, AffineTransformOp.TYPE_BILINEAR);
img = rotator.filter(img, tmp);
img = tmp;

aber das will auch nicht so recht funktionieren...


Jemand eine Ahnung woran das liegen könnte?
 

The_S

Top Contributor
Ohne jetzt größer drüber nachzudenken, du weißt schon, dass ein Bild gedreht (mal abgesehen von 90, 180 und 270°) logischerweiße links, rechts, oben und unten mehr Platz braucht als normal?
 

Pannekuche

Mitglied
Na klar! Deswegen habe ich ja auch in der 2.Variante Hoehe und Breite des neuen Bildes vertauscht.
Aber wie bereits oben erwähnt berechnet der Filter die benötigte Höhe und Breites des Bildes... Ich kann euch mal ein Screenshot posten (nach dem Drehen). Ich denke eher dass es an dem Rotationspunkt liegt
 

Pannekuche

Mitglied
Originalbild:
girry7.png


Gedrehtes Bild:
girrotatedfh8.png
 

kaie

Bekanntes Mitglied
Hier meine (ungetestete) Variante:
Code:
public Image rotateImage( Image in )
{
    // Kopie erzeugen
    BufferedImage out = new BufferedImage( in.getHeight(), in.getWidth(), in.getType() );

    // Graphics2D holen
    Graphics2D g = (Graphics2D)out.getGraphics();

    // Drehung um -90 Grad um (0,0)
    g.setTransform( AffineTransform.getQuadrantRotateInstance(-1);

    // Zeichnen des im gedrehten Koordinatensystem nach oben verschobenen Bildes
    g.drawImage( in, 0, -in.getWidth() );

    // fertig
    return out;
}

Klappt das besser???
 

Pannekuche

Mitglied
1.
AffineTransform.getQuadrantRotateInstance(-1); //die Methode existiert nicht

2.
g.drawImage( in, 0, -in.getWidth() ); //Darf keine BufferdImage als Parameter enthalten

Ich denke wirklich dass es nur an dem Rotationspunkt liegt, dh
Code:
rotation.rotate(Math.toRadians(ROTATERIGHT), img.getWidth() / 2, img.getHeight() / 2);
Nur wie finde ich diesen heraus?
 

kaie

Bekanntes Mitglied
Sorry, habe vollkommen vergessen hierauf nochmal zu antworten:

1: die QuadrantRotate-Methode ist mal wieder aus Java 6 (Beta), hatte ich vergessen zu überprüfen. Nimm stattdessen halt einfach
Code:
g.setTransform( AffineTransform.getRotateInstance(-Math.PI/2) );
2: beim drawImage fehlt natürlich der ImageObserver:
Code:
g.drawImage( in, 0, -in.getWidth(), null );
 
G

Guest

Gast
Hallo,


ich kenne mich selber noch nicht so gut mit dem Java 2D API aus, aber ich vermute mal folgendes: Bei einem Filter gibt es immer eine Eingabe/eine Quelle und eine Ausgabe/ein Ziel. Also probier mal:


Falsch (Ziel und Quelle identisch):
Code:
img = rotator.filter(img, null);

Richtig (Ein Ziel und ein Quell-Puffer):
Code:
outputImg = rotator.filter(inputImg, null);


Gruss
Heiko
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
BraunBerry Rotation mit Radiusänderung Spiele- und Multimedia-Programmierung 0
BraunBerry Rotation von Objekten um ein Raumschiff Spiele- und Multimedia-Programmierung 6
E Rotation um Bildmittelpunkt ohne Affine Transform!!!!! Spiele- und Multimedia-Programmierung 13
RalleYTN LWJGL Rotation Spiele- und Multimedia-Programmierung 1
P Rotation von Sprite klappt nicht Spiele- und Multimedia-Programmierung 4
J Java 3d Rotation Spiele- und Multimedia-Programmierung 6
B j3d Rotation um mehr als eine Achse Spiele- und Multimedia-Programmierung 9
B j3d Kamera Rotation durch Tastendruck Spiele- und Multimedia-Programmierung 12
H Rotation auf Knopfdruck Spiele- und Multimedia-Programmierung 20
T [gelöst] Java3D: Unerwünschte Rotation um die 3.Achse vermeiden? Spiele- und Multimedia-Programmierung 3
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8
V Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen Spiele- und Multimedia-Programmierung 5
E Tetris: Rotation der Tetrominos Spiele- und Multimedia-Programmierung 4
C Java3D Rotation um einen Punkt (y-achse) Spiele- und Multimedia-Programmierung 2
aze Transform3D - dauerhafte Rotation Spiele- und Multimedia-Programmierung 3
J Hilfe: Rotation X und Y Achse (Java3d) Spiele- und Multimedia-Programmierung 12
C JAVA3D Rotation um einen bestimmten Punkt Spiele- und Multimedia-Programmierung 20
"Er" Kamera rotation in Java3D Spiele- und Multimedia-Programmierung 2
R Tetris Rotation? Spiele- und Multimedia-Programmierung 7
P Figur Rotation Spiele- und Multimedia-Programmierung 14
G rotation eines würfels Spiele- und Multimedia-Programmierung 9
T Java3D: Rotation und Translation Spiele- und Multimedia-Programmierung 2
S Rotation relativ zur Rotation einer anderen Transform Group Spiele- und Multimedia-Programmierung 3
S Rotation um verschobene Achse Spiele- und Multimedia-Programmierung 7
Quaxli Java 3D - Rotation mit Alpha Spiele- und Multimedia-Programmierung 2
H Probleme bei Rotation Spiele- und Multimedia-Programmierung 9
J Problem mit Rotation (Sprite3D) Spiele- und Multimedia-Programmierung 4
S Punkt berechnen, nach Rotation Spiele- und Multimedia-Programmierung 2
W Rotation eines Objektes Spiele- und Multimedia-Programmierung 2
W 3d-rotation Spiele- und Multimedia-Programmierung 4
A 2-Achsen Rotation eines Würfels Spiele- und Multimedia-Programmierung 4
B BufferedImage Position Spiele- und Multimedia-Programmierung 8
B BufferStrategy zu BufferedImage? Irgendwie? Spiele- und Multimedia-Programmierung 2
D getsubimage aus BufferedImage und Rueckwandlung in ein ImagePlus bild Spiele- und Multimedia-Programmierung 0
V BufferedImage[] aus anderer Classe auslesen Spiele- und Multimedia-Programmierung 2
F [JMyron] Bild von int[] zu BufferedImage Spiele- und Multimedia-Programmierung 2
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
R BufferedImage > Integer.MAX_VALUE Spiele- und Multimedia-Programmierung 9
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
G BufferedImage -> Farbe wechselt willkürlich Spiele- und Multimedia-Programmierung 15
P int-Array zu BufferedImage (performance?) Spiele- und Multimedia-Programmierung 14
agentone BufferedImage transparent löschen Spiele- und Multimedia-Programmierung 12
radiac Stringtext mit BufferedImage Textur. Spiele- und Multimedia-Programmierung 6
kowa BufferedImage und Antialias Spiele- und Multimedia-Programmierung 2
T BufferedImage#setRGB #getRGB zu langsam Spiele- und Multimedia-Programmierung 4
J Zeichnen in BufferedImage und dieses in Datei speichern Spiele- und Multimedia-Programmierung 2
A Image in BufferedImage konvertieren Spiele- und Multimedia-Programmierung 2
Z Transparenz in BufferedImage Spiele- und Multimedia-Programmierung 8
Z JME - Rendering in BufferedImage Spiele- und Multimedia-Programmierung 14
A Bildbereich als BufferedImage Spiele- und Multimedia-Programmierung 3
M BufferedImage blass machen Spiele- und Multimedia-Programmierung 5
Lulumann6 BufferedImage in VolatileImage casten Spiele- und Multimedia-Programmierung 10
F BufferedImage verursacht OutOfMemoryError Spiele- und Multimedia-Programmierung 11
S Image to BufferedImage Spiele- und Multimedia-Programmierung 3
W Affine Transformation, Rotieren eines Objekts Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben