2D-Grafik BufferedImage sauber rotieren

Luk10

Top Contributor
Grüße,

Ich habe ein BufferedImage das eine 50x50 Png Datei enthält. Nun will ich diese Image in einem bestimmten Winkel drehen.

Dabei stoße ich auf folgende Probleme:
- Gibt es eine Methode, die das einfach für mich lösen kann? Habe keine passende in der API gefunden
- Da das Image quadratisch ist, und von der Position (x, y) nicht verändert werden soll muss der Bezugpunkt des Images geändert werden

Hier eine Skizze dazu:

Das dünner Quadrat ist nur gedacht!
Die Quadrate sollen gleich große sein ... mein MSPaint ist nicht so prall :autsch:

rotieren.png


Kann mir jemand Tipps geben wie sich das machen lässt?

Danke,
-Luk10-
 

Cola_Colin

Top Contributor
Java Platform SE 6

[noparse]
-> http://download.oracle.com/javase/6/docs/api/java/awt/Graphics2D.html#rotate(double, double, double)

-> http://download.oracle.com/javase/6/docs/api/java/awt/Graphics.html#drawImage(java.awt.Image, int, int, java.awt.Color, java.awt.image.ImageObserver)
[/noparse]

...Profit !
 
Zuletzt bearbeitet:

Luk10

Top Contributor
Hm komisch dass ich diese Methode nicht gefunden habe ...
Danke dafür!

Wie sieht das mit dem oben agesprochenen Problem des Bezugpunktes aus? Man gibt ja nur Werte zur Rotation selbst an? Wie wird der gewählt?

-Luk10-
 

Luk10

Top Contributor
Das bedeutet also, wenn ich bei einem 50x50 Pixel Image rotieren an 0, 0 um 90° ist der Bezugspunkt bei 50, 0?

Das wäre ja nicht das ich will ...
 

njans

Top Contributor
Vielleicht hast du es nicht gefunden, da du nur bei dem Graphics Object geguckt hast, nicht beim Graphics2D ?
 

Marco13

Top Contributor
Hmja, das hilft ja alles nichts: Das Bild muss ja auch verschoben werden, und man muss ausrechnen, wie groß das Zielbild sein muss, damit das gedrehte Bild reingemalt werden kann. Alles nicht schwierig, aber ein paar mehr Infos, WIE genau das am Ende aussehen soll, wären nicht verkehrt...Dann kann man da bei Gelegenheit mal die paar Zeilen zusammenhacken...
 

Cola_Colin

Top Contributor
Für die Bildgröße hab ich noch das hier rumliegen:
Java:
    /**
     * Rotiert ein Rechteck und gibt die Maße des neuen umfassenden Rechtecks aus
     * @param data Das Rechteck, [0] = width; [1] = height. Dieses Array wird mit den Ergebnissen gefüllt !
     * @param angle Bogenmass der Drehung
     * @return ein float[2]; [0] = width; [1] = height. Es wird das Array, welches als data übergeben wird, bearbeitet.
     */
    public static float[] rotateDimension(float[] data, float angle) {
        if (data == null || data.length != 2) {
            throw new IllegalArgumentException("The data-array needs to have a length of 2 !!!");
        }
        double sinAngle = sin(angle);
        double cosAngle = cos(angle);
        float d0 = data[0];
        data[0] = (float) (abs(cosAngle * data[0]) + abs(sinAngle * data[1]));
        data[1] = (float) (abs(sinAngle * d0) + abs(cosAngle * data[1]));
        return data;
    }
Hab den Code mal irgendwo verwendet, sollte funktionieren.
Keine Ahnung, ob es dafür auch schon was in der API gebe...

Verschoben muss es nicht werden ?
Der Ablauf sollte sein:
-Berechne Größe des neuen Bildes.
-Lege neues Bild an.
-Zeichne altes Bild auf neues Bild mit der gewünschten Rotation.
 

Luk10

Top Contributor
Es soll nur rotiert werden und seine eigentliche Position (Also die man auf dem Screen sieht) nicht verändern.

Was aber verändert werden muss ist folgendes:

- Bei einem "normalen" Image zeichnet mir drawImage(x, y) das Image bei de Koordinaten x, y ausgehend von links oben des Images (0, 0 des Images)

- Wenn ich diese Image nun rotiere (in der mitte) wird dieser Punkt wohl auch mitrotiert. Somit wird bei drawImage(x, y) das Image an eine andere Position gezeichnet. Das will ich nicht.

Was ich will ist folgendes:

- Ich hab eine (vereinfacht) Ellipse in einem 50x50 Image. Diese soll nun um z.B. 48° im Uhrzeigersinn, im Mittelpunkt des 50x50 Images gedreht werden.

- Dabei soll
+ die Position der Ellipse, abgesehen von ihrer Ausrichtung nicht verändert werden
+ die Ellipse möglichst einfach mit drawImage(x, y) gezeichnet werden

- Dabei stelle ich mir vor,
+ dass es am einfachsten ist 0, 0 des Images "neu zu setzten" um einfach mit drawImage zu zeichnen
+ dass um das Image ein vorgestelltes Quadrat zu legen, welches paralell zu den x, y Achsen ist und somit wieder normal funktioniert

Wie genau sich das umsetzten lässt weiß ich nicht. Deshalb frage ich hier.

Den Code von Cola, danke dafür, verstehe ich so nicht ... ich werde ihn trotzdem bei Gelegenheit mal testen.

Danke,
-Luk10-
 

Marco13

Top Contributor
Hmja, nochmal: Wenn du in dem Bild im ersten Post mal den Mittelpunkt der Quadrate einzeichnest, wirst du sehen, dass der Mittelpunkt sich (bezogen auf (0,0)) nach rechts unten bewegt hat. Mir ist auch noch nicht klar, ob du ein Bild drehen willst, oder nur ein gedrehtes Bild zeichnen willst.
 

Cola_Colin

Top Contributor
Sowas ?

Java:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.JFrame;


/**
 *
 * @author Colin Clausen
 */
public class TestFrame extends JFrame{
    
    public static void main(String[] img) throws IOException, InterruptedException {
        BufferedImage image = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = image.createGraphics();
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0, 0, 50, 50);
        
        TestFrame frame = new TestFrame(image);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setSize(400, 400);
        frame.setVisible(true);
        while(true) {
            frame.draw();
            Thread.sleep(100);
        }
    }
    
    private RotatingImage panelImg;
    
    public TestFrame (Image img) throws IOException {
        panelImg = new RotatingImage(img);
        this.add(panelImg);
    }
    
    public void draw() {
        panelImg.incAngle();
        panelImg.repaint();
    }
}

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import javax.swing.JPanel;


/**
 *
 * @author Colin Clausen
 */
public class RotatingImage extends JPanel{
    private Image srcImage;
    // Bogenmaß !
    private float angle;
    
    public RotatingImage(Image img) {
        srcImage = img;
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, getWidth(), getHeight());
        AffineTransform transform = g2d.getTransform();
        
        g2d.rotate(angle, getWidth()/2, getHeight()/2);
        g2d.drawImage(srcImage, getWidth()/2 - srcImage.getWidth(null)/2,
                getHeight()/2 - srcImage.getHeight(null)/2, null);
        
        g2d.setColor(Color.RED);
        g2d.fillOval(getWidth()/2 - 1, getHeight()/2 - 1, 2, 2);
        
        g2d.setTransform(transform);
    }

    public void incAngle() {
        angle += 0.1f;
    }
}
 

Luk10

Top Contributor
Danke für das Beispiel.

Damit kann ich mal schaun wie ich das auf meine Situation übertragen kann.

Da ich mir den Code jetzt noch nicht besonders intensiv angeschaut habe, da ich gerade an etwas anderem arbeite, kannst du mir kurz sagen, ob man nach dem rotieren einfach wieder mit
Code:
drawImage(x, y)
das Image zeichnen kann oder ob man da einen Ausgleich wie
Code:
drawImage(x+a, y+b)
machen muss.

Vielen Dank für deine Mühe!
-Luk10-
 

Cola_Colin

Top Contributor
einfach Zeichnen. Der Ausgleich in meinem Code rührt daher, dass ich das Bild mittig aufs Panel zeichnen will.
drawImage erwartet aber die linke obere Ecke des Bildes.
 

Cola_Colin

Top Contributor
Dann wirst du wohl die Position des Bildes verwenden müssen....

Um es zu verdeutlichen:
Java:
    @Override
    protected void paintComponent(Graphics g) {
        int imageMiddleX = getWidth()/2;
        int imageMiddleY = getHeight()/2;

        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, getWidth(), getHeight());
        AffineTransform transform = g2d.getTransform();
        
        g2d.rotate(angle, imageMiddleX, getHeight()/2);
        g2d.drawImage(srcImage, imageMiddleX - srcImage.getWidth(null)/2,
                imageMiddleY - srcImage.getHeight(null)/2, null);
        
        // Zeigt nur den Mittelpunkt auf
        g2d.setColor(Color.RED);
        g2d.fillOval(imageMiddleX - 1, imageMiddleY - 1, 2, 2);
        
        g2d.setTransform(transform);
    }

imageMiddleX und Y kannst du einsetzen was immer du willst....
So und jetzt probiere es eben einfach mal aus ;P

Ich denke ich habe eine Vorstellung, von dem was du machen willst und die hier genannten Mittel reichen dazu aus.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
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
C Rotate BufferedImage --> Bild unvollständig 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
L JavaFX JavaFX Application mit Preloader sauber runterfahren AWT, Swing, JavaFX & SWT 10
W JRadioButton sauber untereinander anordnen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben