2011-02-07 15 views
17

Tengo problemas para mostrar BufferedImage girada. Creo que la rotación funciona bien, pero no puedo dibujarla en la pantalla. Mi código:Rotar instancias de BufferedImage

Class extends JPanel { 
    BufferedImage img; 
    int rotation = 0; 

    public void paintComponent(Graphics g) { 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     img2d = img.createGraphics(); 
     img2d.rotate(Math.toRadians(rotation), img.getWidth()/2, img.getHeight()/2); 
     g.drawImage(img, imgx, imgy, null); 
     this.repaint(); 
    } 
} 

Esto no funciona para mí. No pude encontrar ninguna forma de dibujar el img2d girado en g.

EDITAR: Tengo varios objetos que se dibujan en g, por lo que no puedo rotar eso. Necesito poder rotar las cosas individualmente.

Respuesta

18

Yo usaría Graphics2D.drawImage(image, affinetranform, imageobserver).

El siguiente ejemplo de código gira y traduce una imagen al centro del componente. Esta es una captura de pantalla del resultado:

screenshot

public static void main(String[] args) throws IOException { 
    JFrame frame = new JFrame("Test"); 

    frame.add(new JComponent() { 

     BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png")); 

     @Override 
     protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 

       // create the transform, note that the transformations happen 
       // in reversed order (so check them backwards) 
       AffineTransform at = new AffineTransform(); 

       // 4. translate it to the center of the component 
       at.translate(getWidth()/2, getHeight()/2); 

       // 3. do the actual rotation 
       at.rotate(Math.PI/4); 

       // 2. just a scale because this image is big 
       at.scale(0.5, 0.5); 

       // 1. translate the object so that you rotate it around the 
       // center (easier :)) 
       at.translate(-image.getWidth()/2, -image.getHeight()/2); 

       // draw the image 
       Graphics2D g2d = (Graphics2D) g; 
       g2d.drawImage(image, at, null); 

       // continue drawing other stuff (non-transformed) 
       //... 

     } 
    }); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 400); 
    frame.setVisible(true); 
} 
+0

@Squareoot Qué iluminador. –

32

Tal vez debería intentar usar AffineTransform así:

AffineTransform transform = new AffineTransform(); 
    transform.rotate(radians, bufferedImage.getWidth()/2, bufferedImage.getHeight()/2); 
    AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); 
    bufferedImage = op.filter(bufferedImage, null); 

Espero que esto ayude.

4

Está girando los gráficos para dibujar en su imagen, no en la imagen. Por eso no ves ningún efecto. Aplicar la rotación de los gráficos que está pintando sobre y va a dibujar la imagen girada:

public void paintComponent(Graphics g) { 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    g.rotate(Math.toRadians(rotation), img.getWidth()/2, img.getHeight()/2); 
    g.drawImage(img, imgx, imgy, null); 
    this.repaint(); 
} 

Esto probablemente no dibujar por completo lo que se espera, la rotación girará en torno al origen de coordenadas. Para que la imagen sea girar alrededor de su centro es necesario aplicar una traducción de coordenadas antes de la rotación, por ejemplo:

g.translate(imgx >> 1, imgy >> 1); 

El Graphics2D Tutorial tiene muchos más ejemplos.

+0

que desea rotar el BufferedImage por separado y luego dibujar con los gráficos. Tengo otras cosas en el objeto Graphics que no deberían girarse. –

+0

Puede deshacer la transformación de los gráficos después de dibujar la imagen. – Durandal

+2

@Durandal ¿Estás seguro de que 'Graphics' tiene un método de rotación? ¿O quieres decir 'g2d.rotate()'? – user3437460