BufferedImage drehen, falsch positioniert

Opi3

Aktives Mitglied
Hallo,
ich versuche ein BufferedImage um 45° um die z-Achse zu drehen und dann um 45° um die x-Achse.

Das drehen um die x Achse mache ich, indem ich die Höhe des Bildes einfach mit 0.5 Skaliere.

Das ganz soll ein kleines Hilfsprogramm werden, um aus 100px*100px Bildern Isometrisch Tiles zu machen.

Das Ganze funktioniert auch, aber:

Das Bild wird am ende an der Falschen Position gezeichnet:

Ausgangs Bild:
attachment.php


Das Bild das raus kommt:
(Ohne Alpha, damit man die Größe des Bildes sieht)
attachment.php


Die Funktion, in der der Fehler auftritt.

Java:
	private static BufferedImage rotateImage(BufferedImage src, double degrees) {
		
		int width;
		int height;
		
		Point urs = new Point(src.getWidth() / 2,src.getHeight() / 2);
		
		Point p1 = rotatepoint360(new Point(),urs,degrees);
		Point p2 = rotatepoint360(new Point(src.getWidth(),src.getHeight()),urs,degrees);
		
		height = (int) (p2.getY() - p1.getY());
		
		Point p3 = rotatepoint360(new Point(0,src.getHeight()),urs,degrees);
		Point p4 = rotatepoint360(new Point(src.getWidth(),0),urs,degrees);
		
		width = (int) (p4.getX() - p3.getX());
		
		AffineTransform affineTransform = AffineTransform.getRotateInstance(
				Math.toRadians(degrees), src.getWidth() / 2,
				src.getHeight() / 2);
		BufferedImage rotatedImage = new BufferedImage(width,
				height, BufferedImage.TYPE_3BYTE_BGR);
		Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
	    
		g.setTransform(affineTransform);
		g.drawImage(src, 0, 0, null);
		return rotatedImage;
	}

Mir ist bewusst, das sie dringend Refactoring benötigt, es geht momentan aber nur um einen Versuch, wie es klappen könnte.

Also, ich wer dankbar, wenn mir jemand sagen könnte, warum das Tile verschoben gezeichnet wird.

Wer mit hilft bekommt als Belohnung ein Fettes

Danke*
*verkleinerte Abbildung 😉
 
Zuletzt bearbeitet:
Java:
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class ImageRotateTest
{
    public static void main(String[] args) throws IOException
    {
        BufferedImage image = ImageIO.read(new File("images3.jpg"));
        BufferedImage result = rotateImage(image, 45);
        JFrame f = new JFrame();
        ImageIcon i = new ImageIcon(result);
        f.getContentPane().add(new JLabel(i));
        f.pack();
        f.setVisible(true);
    }
    

    private static BufferedImage rotateImage(BufferedImage src, double degrees)
    {
        double w = src.getWidth();
        double h = src.getHeight();
        double sw = Math.ceil(src.getWidth() * Math.sqrt(2));
        double sh = Math.ceil(src.getHeight() * Math.sqrt(2) / 2);
        AffineTransform affineTransform = new AffineTransform();
        affineTransform.translate(sw/2, sh/2);
        affineTransform.scale(1,0.5);
        affineTransform.rotate(Math.toRadians(degrees));
        affineTransform.translate(-w/2, -h/2);
        BufferedImage rotatedImage = new BufferedImage((int)sw, (int)sh, BufferedImage.TYPE_INT_BGR);
        Graphics2D g = (Graphics2D)rotatedImage.createGraphics();
        g.setTransform(affineTransform);
        g.drawImage(src, 0, 0, null);
        g.dispose();
        return rotatedImage;
    }
}

Funktioniert halt erstmal nur vernünftig für 45°, aber ... vielleicht reicht's ja
 
********
Edit: Wollte ich eigentlich noch gar nicht abschicken.
Eventuell kann diesen Post jemand Löschen?
Das der hier schon steht, ist mir leider zu spät aufgefallen...
Opi3
 
Zuletzt bearbeitet:
Und hier das versprochene
DANKE.
Ich weiß ist nicht viel,
tut mir Leid.


Opi3...
... einfach zu Api-Unsicher :autsch:
 
Ich versuche 'meine' (😉) Funktionen immer so allgemein wie Möglich zu halten,
für den jetzigen Anwendungsfall reichen die 45 Grad aber
da es nur darum geht, die Bodenkacheln für mein Spiel von den 100px*100px gif'f in das 'Tile-format' zu konvertieren.

Vielen Dank nochmal,
Opi3
 

Zurück
Oben