Kil
Kil

Reputation: 1

Rotating BufferedImage in Java

I have been trying to rotate an image using for loops. My code does work, but this method seems unnecessary, and the image loses pixels as it rotates. Is there an easier way to do this?

//rotates image around center a degrees
public void drawRotatedImage(Graphics g, BufferedImage image, double a, int x, int y, int pixelSize) {
    //origin point for rotation
    int rX = image.getWidth() / 2;
    int rY = image.getHeight() / 2;

    for(int x1 = 0; x1 < image.getWidth(); x1++) {
        for(int y1 = 0; y1 < image.getHeight(); y1++) {
            int c = image.getRGB(x1, y1);
            //rotating point
            int nX = (int) (((x1-rX) * Math.cos(a)) - ((y1-rY) * Math.sin(a)));
            int nY = (int) (((x1-rX) * Math.sin(a)) + ((y1-rY) * Math.cos(a)));
            g.setColor(new Color(c));
            //drawing each pixel
            g.fillRect((nX*pixelSize) + x, (nY*pixelSize) + y, pixelSize, pixelSize);
        }
    }
}

Upvotes: 0

Views: 734

Answers (2)

user12026681
user12026681

Reputation:

Try using AffineTransform

get a rotated instance

static void rotate(BufferedImage from, BufferedImage to, double rotate)
{
  // rotate around the center
  AffineTransform trans
  = AffineTransform.getRotateInstance(rotate,
      from.getWidth()/2, from.getHeight()/2);
  AffineTransformOp op = new AffineTransformOp(trans,
                AffineTransformOp.TYPE_BILINEAR);
  op.filter(from, to);
}

or drawing it directly

static void rotate(Graphics2d g2d, BufferedImage img, double rotate)
{
  // rotate around the center
  AffineTransform trans
  = AffineTransform.getRotateInstance(rotate,
      from.getWidth()/2, from.getHeight()/2);

  g2d.drawImage(img, trans, null);
}

Upvotes: 0

JavaMan
JavaMan

Reputation: 1217

I've created a simple example program (adapted from Rotating BufferedImage instances)

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

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

        frame.add(new JComponent() {

            BufferedImage image = ImageIO.read(new URL(
                    "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D0%9D%D0%B5%D1%80%D0%BF%D0%B8%D1%87%D0%B8%D0%B9_%D0%B2%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4.jpg/500px-%D0%9D%D0%B5%D1%80%D0%BF%D0%B8%D1%87%D0%B8%D0%B9_%D0%B2%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4.jpg"));

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

                AffineTransform at = new AffineTransform();
                at.translate(getWidth() / 2, getHeight() / 2); // draw image in center of frame
                // at.scale(0.5, 0.5);
                at.rotate(Math.toRadians(180));
                at.translate(-image.getWidth() / 2, -image.getHeight() / 2); // rotate around the center

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

            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 800);
        frame.setVisible(true);
    }
}

Upvotes: 0

Related Questions