Bild drehen

flflfl

Mitglied
Hallo,

ich versuche ein Bild zu drehen - schaffe es aber nicht korrekt. Das neue Bild ist immer etwas verschoben (bzw. abgeschnitten - da verschoben)

Mein Code:
Java:
public class Rotate extends JPanel {

    BufferedImage img;

    Rotate() {
        try {
            img = ImageIO.read(new File("c:\\test1.jpg"));
        } catch (Exception e) {
            System.err.println("Fehler beim lesen");
        }
    }

    public void paintComponent(Graphics g) {
        //Original zeichnen
        g.drawImage(img, (this.getWidth() - img.getWidth()) / 2, (this.getHeight() - img.getHeight()) / 2, this);

        BufferedImage ret = rot();
        g.drawImage(ret, (this.getWidth() - ret.getWidth()) / 2, (this.getHeight() - ret.getHeight()) / 2, this);

    }

    public BufferedImage rot() {
        double degree = Math.toRadians(45);

        //New Dimensionen weil gedrehtes Bild mehr Platz benötigt
        int newW = (int) (img.getWidth() * Math.sin(degree) + img.getHeight() * Math.cos(degree));
        int newH = (int) (img.getHeight() * Math.cos(degree) + img.getWidth() * Math.sin(degree));

        BufferedImage ret = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

        //AffineTransform drehen
        AffineTransform tx = new AffineTransform();
        tx.rotate(degree, (double) (img.getWidth() / 2), (double) (img.getHeight() / 2));

        //AffineTransform Operation ausführen
        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
        op.filter(img, ret);

        return ret;
    }
}

Danke für eure Hilfe!
 

mabuhay

Bekanntes Mitglied
Verwende folgenden Code um ein Bild zu drehen:

Java:
		if (rotateAngleCurrent >= 360) {
			rotateAngleCurrent = rotateAngleStep;
		} else {
			rotateAngleCurrent += rotateAngleStep;
		}

		newImg = new BufferedImage(iUpdate.getIconWidth(), iUpdate.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
		g2d = newImg.createGraphics();

		//rotate with the anchor point as the mid of the image
		affineTransform.rotate(-Math.toRadians(rotateAngleStep), iUpdate.getIconWidth()/2, iUpdate.getIconHeight()/2);
	  	//Draw the rotated image
		g2d.drawImage(iUpdate.getImage(), affineTransform, null);

Sehe gerade ist ja etwas das gleiche wie deine Lösung :p

Um wieviel wird das Bild denn abgeschnitten oder verschoben? evtl. nur um 1 pixel? Wenn ja könnte es davon kommen dass du eine integer-Zahl durch 2 dividierst. Da kann schon mal .5 herauskommen was dann natürlich abgeschnitten wird.

mfg
 
Zuletzt bearbeitet:

flflfl

Mitglied
nein, es ist viel mehr verschoben:
rotate.png


ich habe noch vor dem degree ein Minus eingefügt (wie in deinem Beispiel) brachte aber nichts.
Java:
    public BufferedImage rot() {
        double degree = Math.toRadians(45);

        //New Dimensionen weil gedrehtes Bild mehr Platz benötigt
        int newW = (int) (img.getWidth() * Math.sin(degree) + img.getHeight() * Math.cos(degree));
        int newH = (int) (img.getHeight() * Math.cos(degree) + img.getWidth() * Math.sin(degree));

        BufferedImage ret = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

        //AffineTransform drehen
        AffineTransform tx = new AffineTransform();
        tx.rotate(-degree, img.getWidth() / 2, img.getHeight() / 2);

        //AffineTransform Operation ausführen
        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
        op.filter(img, ret);

        return ret;
    }
 

André Uhres

Top Contributor
Versuch's mal so:
Java:
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class Rotate extends JPanel {
    private BufferedImage img;
    private double degree = Math.toRadians(20);
    Rotate() {
        try {
            img = ImageIO.read(new File("c:\\test1.jpg"));
        } catch (Exception e) {
            System.err.println("Fehler beim lesen");
        }
    }
    @Override
    public Dimension getPreferredSize() {
        Dimension dim = super.getPreferredSize();
        //New Dimensionen weil gedrehtes Bild mehr Platz benötigt
        dim.width = (int) (img.getHeight() * Math.sin(degree) + img.getWidth() * Math.cos(degree));
        dim.height = (int) (img.getHeight() * Math.cos(degree) + img.getWidth() * Math.sin(degree));
        return dim;
    }
    @Override
    public void paintComponent(final Graphics g) {
        //Original zeichnen
        g.drawImage(img, (this.getWidth() - img.getWidth()) / 2, (this.getHeight() - img.getHeight()) / 2, this);
        //mit Drehung zeichnen:
        rot(g.create());
    }
    public void rot(final Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        int w = img.getWidth();
        int h = img.getHeight();
        int x = (this.getWidth() - w) / 2;
        int y = (this.getHeight() - h) / 2;
        //center of rotation is center of the Image:
        int xRot = x + w / 2;
        int yRot = y + h / 2;
        //rotate:
        AffineTransform rotation = g2d.getTransform();
        rotation.rotate(degree, xRot, yRot);
        //draw Image with rotation:
        g2d.setTransform(rotation);
        g2d.drawImage(img, x, y, w, h, this);
        g2d.dispose();
    }
    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new Rotate());
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}
 
Zuletzt bearbeitet:

mabuhay

Bekanntes Mitglied
Könnte es sein dass das Bild ret halt grösser ist als das Bild img und daher deine Koordinaten nicht mehr stimmen? In deinem Bild sieht es so aus, als wäre der Mittelpunkt gerade um den vergrösserten Bereich verschoben.

André Uhres zeichnet das Original-Bild und berechnet die Koordinaten für das gedrehte Bild separat.
 

flflfl

Mitglied
Ich weiß, dass es irgendwo an den Koordinaten liegt, jedoch will ich es unbedingt mit den AffineTransform hinbekommen.

Mein Code jetzt: (Bild ist nun absichtlich nicht zentriert um weitere Fehlerquellen auszuschließen)
Java:
            int newW = (int) (img.getWidth() * Math.sin(degree) + img.getHeight() * Math.cos(degree));
            int newH = (int) (img.getHeight() * Math.cos(degree) + img.getWidth() * Math.sin(degree));

            BufferedImage ret = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

            //rotate:
            AffineTransform rotation = new AffineTransform();
            rotation.translate((newW - img.getWidth()) / 2, (newH - img.getHeight()) / 2);
            rotation.rotate(degree, (newW - img.getWidth()), (newH - img.getHeight()));

            AffineTransformOp op = new AffineTransformOp(rotation, AffineTransformOp.TYPE_BICUBIC);
            ret = op.filter(img, null);

            int x = 0;
            int y = 0;

            g.drawImage(ret, x, y, this);

            g.setColor(Color.red); //Rund um das gedrehte Bild einen roten Rahmen zeichnen, damit man die Dimensions des Bildes zieht
            g.drawRect(x, y, ret.getWidth(), ret.getHeight());

bringt dieses Ergebnis:
recqu.png
 

mabuhay

Bekanntes Mitglied
Jetzt siehst du ja am roten Rahmen dass etwas mit den Dimensionen des gedrehten Bildes nicht stimmt. ein wenig zu hoch und zu wenig breit.
Die Drehung scheint ja OK zu sein da es so aussieht wie wenn es sich um den Mittelpunkt dreht. Könnte es vielleicht noch sein dass dein Panel oder was es auch immer ist einfach zu klein ist und darum ein paar Sachen abgeschnitten werden? Irgendwie ist die Ecke nummer 3 ja am linken Fensterrand abgeschnitten. Sehe sonst nichts verdächtiges...
 

flflfl

Mitglied
Hallo,

tja das mit den Dimensionen scheint so, aber ich habe es nachgerechnet und es sollte eigentlich passen...

Die Dimension des OriginalQuadrats: 300x300px
Die Dimension des neuenQuadrats ("roter Rahmen"): 424x424px

Ich habe das ganze so berechnet:
hoehelaenge.jpg

Neue Höhe ist dann h1 + h2, neue Breite = l1 + l2

Wenn ich es mit den Lehrsatz des Pytagoras nachrechne, komme ich zum gleichen Ergebnis: QuadratWurzel aus (300² + 300²) = 424,26.

Also sollten die Dimensionen auf alle Fälle stimmen.

lg

p.s. hab gerade gesehen, dass im obigen Beispiel einmal bei der Berechnung der neuen Dimensionen getWidth() und getHeight() vertauscht sind, sollte aber egal sein, da es ein Quadrat ist.
 

mabuhay

Bekanntes Mitglied
Die Berechnungen zur neuen Grösse sollten schon stimmen, sehe da nichts verdächtiges.
Java:
rotation.translate((newW - img.getWidth()) / 2, (newH - img.getHeight()) / 2);
Brauchst du diese Zeile überhaupt? Du gibst doch schon bei rotate(...) an um welchen Punkt gedreht werden soll. Irgendwie verschiebst du den Punkt ja nur um 62 Pixel wenn du "(newW - img.getWidth()) / 2" berechnest.
Und versuche mal
Java:
rotation.rotate(degree, newW / 2, newH / 2);
Ich sehe gerade, das hast du weiter oben ja schon versucht. Dort war das rotierte Bild wenigstens an beiden Ecken gleich abgeschnitten. Bei deinem letzten Post ist es irgendwie ganz an einer komischen Position... Peim Post #3 sieht es einfach so aus wie wenn du es nicht an der richtigen Position wieder zeichnest oder die Transformations-koordinaten falsch sind. verwende bei
Java:
tx.rotate(-degree, img.getWidth() / 2, img.getHeight() / 2);
statt img.getWidth() und img.getHeight() doch mal newW und newH.

Als Test kannst du mal versuchen mal das BufferedImage nicht mit der neuen Grösse zu erstellen, dann sollten ja alle Ecken gleich abgeschnitten sein.
Ich denke mal mit op.filter(img, ret) wird das Bild gedreht und dann ins neue grössere Bild gezeichnet, aber immer noch mit gleichen x- und y-Koordinaten.

Also: versuche mal den Weg in Post #7 mit den Änderungen von translate() und rotate() die ich dir vorschlage.

mfg
 
Ä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
T Bild drehen + richtige größe berechnen Java Basics - Anfänger-Themen 4
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
R UML-Bild (Erkennung ob static o. nicht) Java Basics - Anfänger-Themen 18
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
krgewb Bild itextpdf Java Basics - Anfänger-Themen 2
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
VPChief Bild in JEditorPane Java Basics - Anfänger-Themen 9
B Warum bekomme ich kein Bild. Java Basics - Anfänger-Themen 10
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
S Ein Bild mit dynamischer Quelle neuzeichnen Java Basics - Anfänger-Themen 12
N GLOOP Bild nicht ansichtbar Java Basics - Anfänger-Themen 5
M Bild in JFrame Java Basics - Anfänger-Themen 1
B Signatur erstellen - Bild ist nur weiß Java Basics - Anfänger-Themen 0
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 17
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
M jTextPane Bild anzeigen Java Basics - Anfänger-Themen 6
CptK Bild beim betätigen eines JButtons Java Basics - Anfänger-Themen 6
S Bild über JButton legen Java Basics - Anfänger-Themen 3
B Bild mit Schrift befüllen / Anpassung bei Wortlänge Java Basics - Anfänger-Themen 2
D Google maps bild mit marker versehen Java Basics - Anfänger-Themen 12
D ImageView mit einfarbigem Bild fuellen Java Basics - Anfänger-Themen 3
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
J Bild in Button einsetzen Java Basics - Anfänger-Themen 6
S button kommt durch bild Java Basics - Anfänger-Themen 13
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
S Bild einfügen Java Basics - Anfänger-Themen 16
binop Bild anzeigen lassen Java Basics - Anfänger-Themen 2
D Bild zu Text Java Basics - Anfänger-Themen 4
I HTML Code in Bild (transparent) konvertieren Java Basics - Anfänger-Themen 0
I Watermark erstellen mit HTML in Bild? Java Basics - Anfänger-Themen 7
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2
Anfänger2011 Bild programmieren?! Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
S Bild in JOptionPane Java Basics - Anfänger-Themen 1
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
J Bild loopen Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
S Bild bei Kontakt ändern Java Basics - Anfänger-Themen 2
C Erste Schritte Bild holen und speichern Java Basics - Anfänger-Themen 1
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
J Ganzes Bild Java Basics - Anfänger-Themen 4
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
I Bild aus Bereich laden Java Basics - Anfänger-Themen 3
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
Y Nach Bild-Upload wird Bild nicht angezeigt Java Basics - Anfänger-Themen 1
M Button mit Bild und Text Java Basics - Anfänger-Themen 2
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
Sogomn Bild will sich nicht skalieren lassen Java Basics - Anfänger-Themen 1
P Ein Bild für GUI (Java-Editor) Java Basics - Anfänger-Themen 4
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
P Bild bearbeiten Java Basics - Anfänger-Themen 9
Z Datenmatrix in Bild verwandeln Java Basics - Anfänger-Themen 4
C Bild verschwinden lassen Java Basics - Anfänger-Themen 7
S Bild Icon aus ID3Tag auslesen Java Basics - Anfänger-Themen 4
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
C Greenfoot: Bei Tastendruck und best. Wert Bild ändern Java Basics - Anfänger-Themen 2
O Auflösung einer Bild-Datei bekommen ohne sie herunterzuladen?? Java Basics - Anfänger-Themen 7
L Bild-Datein "zuschneiden" Java Basics - Anfänger-Themen 11
O DeviantArt-Bild Konverter: Fehler.. Java Basics - Anfänger-Themen 16
K Transparents Bild laden -> Fehlermeldung Java Basics - Anfänger-Themen 6
M Bild einbinden Java Basics - Anfänger-Themen 7
2 Bild auf JApplet zeichnen Java Basics - Anfänger-Themen 18
T Bild laden Java Basics - Anfänger-Themen 7
R Bild in GUI Java Basics - Anfänger-Themen 11
D Eclipse Juno zeigt Bild nicht bei Run Java Basics - Anfänger-Themen 3
Kenan89 Bild mit jar öffnen Java Basics - Anfänger-Themen 4
S Problem bei Bewegung von einem Bild! Java Basics - Anfänger-Themen 2
J Bild mit transparenter Farbe Java Basics - Anfänger-Themen 10
N Erste Schritte Applet zeichnet Bild nicht Java Basics - Anfänger-Themen 10
J Bild auf JLabel wird nicht angezeigt Java Basics - Anfänger-Themen 11
J Bild einfügen Java Basics - Anfänger-Themen 3
T ASCII Art von Bild erstellen. Java Basics - Anfänger-Themen 32

Ähnliche Java Themen

Neue Themen


Oben