# Bild drehen UND skalieren (Image bzw BufferedImage)



## Regine (9. Jun 2010)

Hallo,

ich habe leider ein kleines Problem mit dem Anzeigen meiner Bilder.

Ich kann mein Bild drehen, aber ich bekomme es nicht hin das es auf 100x100 Pixel verkleinert wird.

Nachdem ich sämtliche Bücher google etc. durchsucht habe funktioniert beides einzeln.

Ich hoffe ich habe nichts übersehen und stelle hier eine Frage zum x-ten mal, dann sorry.

public Image drehen() throws IOException{


		bufferedImage = ImageIO.read(new File(getAblsolutPath()));

		rotatedImage = new BufferedImage(bufferedImage.getWidth(this),bufferedImage.getHeight(this), bufferedImage.getType() );

		Graphics2D g = rotatedImage.createGraphics();
		 g.translate(0, bufferedImage.getWidth(this));
		 g.rotate(Math.toRadians(-90));

		g.drawImage(bufferedImage, 0, 0, this);	

		return rotatedImage;

	}


public Image scalieren(int x, int y) throws IOException{
		this.x=x;
		this.y=y;

		image = ImageIO.read(new File(getAblsolutPath()));
		//create scaled BufferedImage

        scaledImage = new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB);
      //draw image on it:

              Graphics2D g2 = scaledImage.createGraphics();
              g2.drawImage(image, 0, 0, x, y, null);

		return scaledImage;

	}


funktioniert einzeln super, aber ich bekomme es einfach nicht zusammen.

Grüße Regine


----------



## Michael... (9. Jun 2010)

Statt in jeder Methode ein neues Bild zu erzeugen könntest Du ja das Bild, welches Du von der einen Methode erhälst an die nächste zur weiteren Bearbeitung übergeben.

Ausserdem kann man wie Du (selbst?) festgestellt hast bei drawImage die Größe des Bildes angeben. Das könnte man ja dann ebenfalls beim Zeichnen des rotierten Bildes anwenden - und hätte dann Skalierung und Rotation in einem.

Die Klasse Image verfügt im Übrigen über die Methode getScaledInstance(...) die ein skaliertes Bild zurückliefert.


----------



## Regine (9. Jun 2010)

Scalierung und Rotation in einem habe ich probiert, ich bekomme dann ein schwarzes Bild der gewünschten Größe.

Ich habe zuerst mit getScaled Instance gearbeitet aber das geht nur bei Image.
Zum Rotieren brauche ich aber ein BufferedImage. Deshalb wollte ich das Ganze in einem machen und einfach bein Rotieren die Größe mitgeben. Ich finde leider nicht heraus warum ich immer nur schwarze Bilder bekomme.
Mein Versuch sieht folgendermaßen aus:

BufferedImage scalesImage;
Bufferedmage bufferedImage;

public Image drehen(int x, int y) throws IOException{
		/*
		this.x=x;
		this.y = y;
		bufferedImage = ImageIO.read(new File(getAblsolutPath()));
		//create scaled BufferedImage

        scaledImage = new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB);
      //draw image on it:

              Graphics2D g2 = scaledImage.createGraphics();
              g2.translate(0, bufferedImage.getWidth(this));
              g2.rotate(Math.toRadians(-90));
              g2.drawImage(bufferedImage, 0, 0, x, y, null);


		return scaledImage;
}

Grüße Regine


----------



## Regine (9. Jun 2010)

Fehler gefunden.
Vielleicht bringt die Lösung jemand anderem noch was.


Bei mir funktioniert es wenn ich ein BufferedImage erst scaliere und dann der Methode für das drehen das bereits scalierte BufferedImage übergebe. Das ist wahscheinlich nicht das Eleganteste, aber es funktioniert.

Leider versteh ich nicht wieso es nicht gleichzeitig geht.


----------



## Michael... (9. Jun 2010)

Regine hat gesagt.:


> Scalierung und Rotation in einem habe ich probiert, ich bekomme dann ein schwarzes Bild der gewünschten Größe.


Vermutlich passt da was nicht mit Deiner Translation des Uprungs.
Mach mal statt:

```
g2.translate(0, bufferedImage.getWidth(this));
```


```
g2.translate(0, scaledImage.getHeight(this));
```
Hier mal ein KSKB:

```
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;
public class ScaleRotateImageDemo extends JFrame {
	private BufferedImage imageCopy;
	private BufferedImage image;
	
	public ScaleRotateImageDemo() {
		image = new BufferedImage(350, 200, BufferedImage.TYPE_INT_RGB);
		Graphics2D g = image.createGraphics();
		g.setColor(Color.BLUE);
		g.fillRect(0, 0, image.getWidth(), image.getHeight());
		g.setColor(Color.CYAN);
		g.fillRect(20, 20, image.getWidth()-40, image.getHeight()-40);
		g.setColor(Color.BLUE);
		g.setFont(new Font("Arial", Font.BOLD, 60));
		g.drawString("Test", 30, 70);
		g.dispose();
		
		int w =100, h = 50;
		
		imageCopy = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = imageCopy.createGraphics();
        g2.translate(0, imageCopy.getHeight(null));
        g2.rotate(Math.toRadians(-90));
        g2.drawImage(image, 0, 0, h, w, null);
        g2.dispose();
        this.getContentPane().add(new JPanel() {
        	public void paintComponent(Graphics g) {
        		super.paintComponent(g);
        		g.drawImage(image, 0, 0, null);
        		g.drawImage(imageCopy, image.getWidth()+10, 0, null);
        	}
        });
	}
	
	public static void main(String[] args) {
		JFrame frame = new ScaleRotateImageDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## Regine (10. Jun 2010)

Vielen Dank für deine Mühe!

Grüße Regine


----------

