Search code examples
javaswingrotationbufferedimagegraphics2d

Rotating BufferedImage instances


I am having trouble getting a rotated BufferedImage to display. I think the rotation is working just fine, but I can't actually draw it to the screen. My code:

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();
    }
}

This is not working for me. I could not find any way to draw the rotated img2d onto g.

EDIT: I have multiple objects that are being drawn onto g, so I can't rotate that. I need to be able to rotate things individually.


Solution

  • I would use Graphics2D.drawImage(image, affinetranform, imageobserver).

    The code example below rotates and translates an image to the center of the component. This is a screenshot of the result:

    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);
    }