AWT graphics2d transform

L

liann

Mitglied
Hallo, ich habe ein Bild, was unter umständen gedreht dargestellt werden soll. Dazu habe ich folgende zeilen geschrieben
Java:
       g2 = (Graphics2D) g2.create();
        g2.rotate(Math.toDegrees(rotation));
        g2.drawImage(img(), xCoordinate(), yCoordinate(), null);
        if (rotationDraw != null) rotationDraw.draw(g2);
        g2.dispose();
wenn rotation == 0 ist, klappt alles, andernfalls sehe ich das bild einfach nicht. Ich denke mal das Bild ist an irgendeiner Stelle gezeichnet, ich weiß aber 1. nicht wo und 2. nicht wie ich es den Koordinaten xCoordinate() und yCoordinat() zeichnen kann. Wie geht das am Besten?
Ich habe auch mir transform und 3 parametern versucht, klappte aber auch nicht.
Code:
            g2.setTransform(AffineTransform.getRotateInstance(Math.toDegrees(rotation),
                    xCoordinate() + img().getWidth() / 2d,
                    yCoordinate() + img().getHeight() / 2d));
 
R

realodds

Aktives Mitglied
Java:
public static void drawRotatedImage(BufferedImage image,
                                        double degrees, int x, int y, Graphics2D g2) {
        double rX = image.getWidth() / 2d;
        double rY = image.getHeight() / 2d;
        AffineTransform tx = AffineTransform
                .getRotateInstance(Math.toRadians(degrees), rX, rY);
        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
        g2.drawImage(image, op, x, y);
    }
 
N

NoName2

Mitglied
Bitte möglichst immer vollständige Beispiele angeben, so ginge es auch:
Java:
	public static void rot(String img, int degree) throws IOException {
		BufferedImage i = ImageIO.read(new File(img));
		JFrame f = new JFrame() {
			@Override
			public void paint(Graphics g) {
				super.paint(g);
				Graphics2D g2d = (Graphics2D) g;
				g2d.rotate(Math.toRadians(degree));

				Point2D p2 = new Point();
				AffineTransform.getRotateInstance(Math.toRadians(degree)).transform(new Point(0, i.getHeight()), p2);

				g2d.drawImage(i, (int) Math.ceil(-p2.getX()), 0, null);
			}
		};
		f.setSize(800, 800);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	public static void main(String[] args) throws IOException {
		rot("...png", 35);
	}

nur aus irgendeinem Grund berechnet er die Bounding-Box (AffineTransform) bei mir falsch. :(
 
N

NoName2

Mitglied
Man sollte besser mit einer Canvas zeichnen 🤦‍♂️
Tatsächlich ist es so, dass ungefähr bis 20 Grad die BB richtig berechnet wird, danach aber nicht mehr:
Java:
	public static void rot(String img, int degree) throws IOException {
		BufferedImage i = ImageIO.read(new File(img));
		JFrame f = new JFrame();
		f.add(new Canvas() {
			@Override
			public void paint(Graphics g) {
				super.paint(g);
				Graphics2D g2d = (Graphics2D) g;
				g2d.rotate(Math.toRadians(degree));

				int min = 0;
				for (int j = 0; j <= i.getHeight(); j++) {
					int x2 = (int) -(j * Math.sin(Math.toRadians(degree)));
					if (x2 < min) {
						min = x2;
					}
				}
				System.out.println(min);

				g2d.drawImage(i, -min, 0, null);
			}
		});
		f.setSize(800, 800);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
 
N

NoName2

Mitglied
Ja aber du rotierst auch um den Mittelpunkt... ich weiß nicht, warum es sich so seltsam am linken Rand verhält, wenn um (0, 0) rotiert wird...
 
N

NoName2

Mitglied
Nach 5 Tagen... hab ich es doch noch hinbekommen... es richtig zu machen und die BoundingBox sowie translate und rotate in der richtigen Reihenfolge aufzurufen:
Java:
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.WindowConstants;

public class RotImg {
	public static Rectangle2D getRotRec(AffineTransform at, int w, int h) {
		int minx = 0;
		int miny = 0;
		int maxx = 0;
		int maxy = 0;
		for (int j = 0; j < 4; j++) {
			Point p1 = new Point((j & 1) == 0 ? 0 : (w - 1), (j & 2) == 0 ? 0 : (h - 1));
			Point p2 = new Point();
			at.transform(p1, p2);
			if (p2.x < minx) {
				minx = p2.x;
			}
			if (p2.y < miny) {
				miny = p2.y;
			}
			if (p2.x > maxx) {
				maxx = p2.x;
			}
			if (p2.y > maxy) {
				maxy = p2.y;
			}
		}
		return new Rectangle(minx, miny, maxx - minx, maxy - miny);
	}

	public static void rot(String img) throws IOException {
		BufferedImage i = ImageIO.read(new File(img));
		JSlider js = new JSlider(0, 360, 0);
		Canvas cs = new Canvas() {
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
			public void paint(Graphics g) {
				super.paint(g);

				int degree = js.getValue();
				AffineTransform at = new AffineTransform();
				at.rotate(Math.toRadians(degree), i.getWidth() / 2.0, i.getHeight() / 2.0);
				Rectangle2D rec = getRotRec(at, i.getWidth(), i.getHeight());

				AffineTransform at2 = new AffineTransform();
				at2.translate(-rec.getMinX(), -rec.getMinY());
				at2.rotate(Math.toRadians(degree), i.getWidth() / 2.0, i.getHeight() / 2.0);

				Graphics2D g2d = (Graphics2D) g;
				g2d.drawRect(0, 0, (int) rec.getWidth(), (int) rec.getHeight());
				g2d.setTransform(at2);
				g2d.drawImage(i, 0, 0, null);
			}
		};

		JFrame f = new JFrame();
		f.setLayout(new BorderLayout());
		f.add(cs, BorderLayout.CENTER);
		f.add(js, BorderLayout.SOUTH);
		f.setSize(1000, 1000);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setVisible(true);

		js.addChangeListener((e) -> {
			JSlider src = (JSlider) e.getSource();
			//if (!src.getValueIsAdjusting()) {
				cs.repaint();
			//}
		});
	}

	public static void main(String[] args) throws IOException {
		rot("Pfad eintragen");
	}
}
Probierts mal aus!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
Soloeco Graphics2D - Verbinden zweier Punkte AWT, Swing, JavaFX & SWT 6
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
D AWT Graphics2D getClip gibt null zurück AWT, Swing, JavaFX & SWT 3
B Graphics2D Componente Drehen AWT, Swing, JavaFX & SWT 2
M Graphics2D: drawString Berechnung AWT, Swing, JavaFX & SWT 1
X AWT Graphics2D zum LWJGL Display hinzufügen aber wie? AWT, Swing, JavaFX & SWT 4
D Graphics2D einen Bereich füllen AWT, Swing, JavaFX & SWT 1
M JPanel und Graphics2D AWT, Swing, JavaFX & SWT 2
S Java2D/Graphics2D in Android..? AWT, Swing, JavaFX & SWT 2
B Graphics2d drawString mit double Werten? AWT, Swing, JavaFX & SWT 5
S Graphics2D: Transparent übereinander zeichnen AWT, Swing, JavaFX & SWT 7
S Graphics2D - setClip() AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Graphics2D object in ein anderes Zeichnen AWT, Swing, JavaFX & SWT 7
S AWT Pong - Probleme mit übergreifenden Objekten && Graphics2D AWT, Swing, JavaFX & SWT 3
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
N AWT Graphics2D mehrmals aufrufen AWT, Swing, JavaFX & SWT 5
Developer_X Swing Graphics2D.zoom, wie rückgängig machen? AWT, Swing, JavaFX & SWT 6
Developer_X Swing Graphics2D translate zerstört performance AWT, Swing, JavaFX & SWT 2
N graphics2d auf panel AWT, Swing, JavaFX & SWT 2
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
0 AWT Graphics2D.drawImage() funktioniert nicht mehr korrekt mit Core i7 AWT, Swing, JavaFX & SWT 4
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
A Swing Mit Graphics2D auf transparentem Hintergrund zeichnen AWT, Swing, JavaFX & SWT 7
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
cowabunga1984 Implementierung von Graphics2D AWT, Swing, JavaFX & SWT 2
C Graphics2D, Text abschneiden AWT, Swing, JavaFX & SWT 2
N Graphics2D mit unterschiedlichen Grauwerten befüllen AWT, Swing, JavaFX & SWT 3
F Graphics2D scale und Positionierung einer TextArea AWT, Swing, JavaFX & SWT 8
F JPanel: Graphics2D, scale und Mauskoordinaten AWT, Swing, JavaFX & SWT 4
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
M Graphics2D - abstract void draw(.) AWT, Swing, JavaFX & SWT 2
redztripe Graphics2D rotieren und rotiertes Bild abspeichern AWT, Swing, JavaFX & SWT 2
R AffinrTransform + Graphics2D verschieben AWT, Swing, JavaFX & SWT 3
R Graphics2D + Bild anzeigen. AWT, Swing, JavaFX & SWT 25
M Probleme mit Graphics2D AWT, Swing, JavaFX & SWT 7
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
N 2D-Grafik AffineTransform - Punkte abfragen nach transform() AWT, Swing, JavaFX & SWT 3
lumo SWT Transform AWT, Swing, JavaFX & SWT 6
M 2D-Grafik SWT mit Transform zeichnet ungenau AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen

Anzeige

Neue Themen


Oben