Images in Java manipulieren

Iam_Fiction

Mitglied
Hallo ich habe folgendes Problem. Ich erstelle mir aus einer File in Java ein Image. Das resultierende Image möchte ich gerne um 45 ° drehen und dann im Verhältnis 1:0,5 (b:h) skalieren (so dass aus einem anfangs quadratischen Image eine Art Raute entsteht). Ich habe das ganze mit AffineTransform versucht aber irgendwie verhalten sich die Anweisungen nacheinander angewandt eigenartig und ergeben verschiedene Resultate je nach Anwendung. Scheinbar beziehen sie sich auch auf das nicht veränderte Standartimage. Am Ende zB sollte das gedrehte Bild wieder perfekt in ein Image passen was nach meiner Implementierung nicht der Fall ist...

Hier ein Teil meines Versuches...

Code:
BufferedImage image = new BufferedImage(700, 350, BufferedImage.TYPE_INT_RGB);
		
		Graphics g = image.getGraphics();
		Graphics2D g2d = (Graphics2D) g;
		
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		AffineTransform trans = AffineTransform.getScaleInstance(1, 0.5);
		trans.rotate(Math.toRadians(-45d), image.getHeight()/2, image.getHeight()/2);
		trans.translate(-90, 110);
		g2d.transform(trans);
		

		FileInputStream fi;
		try {
			fi = new FileInputStream("D:\\map.mgx");

			byte[] buf = new byte[2];

			for (int y = 0; y < 480; y += 4) {

				for (int x = 0; x < 480; x += 4) {
					if (fi.read(buf) != -1) {

						Byte t = new Byte(buf[0]);
						int co = t.intValue();

						g2d.setColor(terrain[co]);
						g2d.fillRect(x, y, 4, 4);
						g2d.drawRect(x, y, 4, 4);
					}
				}
			}
			
			return image;

Im Anhang noch das Image anfangs und das resultierende. Das Ergebnisimage sollte jedoch sauber eingepasst sein am Ende.
 

Anhänge

  • orig.JPG
    orig.JPG
    14,6 KB · Aufrufe: 55
  • res.JPG
    res.JPG
    21,8 KB · Aufrufe: 60
Funktioniert bei mir leider nicht, das Bild wird dann irg zuerst skaliert und dann rotiert was nicht zum gewünschten Ergebnis führt :(

edit: Hab einiges rumprobiert jetzt und ich kann die Reihenfolge der Anwendung der Veränderungen durch AffineTransform null nachvollziehen einmal zieht er das .scale vor obwohl es nach dem .rotate steht das andere Mal zieht er den .rotate vor obwohl er nach dem .scale steht... oO

Mit ein bisschen tricksen funktioniert die Reihenfolge, jedoch bekomme ich das rotierte und sklierte Image nie in ein Image ohne irgendeinen überstehenden Rand :(
 
Zuletzt bearbeitet:
Der Fehler scheint sich durch die Drehrichtung zu ergeben bei rotate(Math.toRadians(45d),... funktioniert dei Platzierung, bei -45 ° wie gewollt funktioniert es jedoch nicht :(
 
Und gehts mit +315 Grad?

Wie auch immer ist doch einfach nur ein wenig Mathe. Hab allerdings selber gerade wenig Lust da zu suchen wo das Problem ist. Sollte sich aber mit ein wenig Rechenkunst lösen lassen.
 
Zurück