Вращение экземпляров BufferedImage - PullRequest
19 голосов
/ 07 февраля 2011

У меня проблемы с поворотом 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();
    }
}

Это не работает для меня. Я не мог найти способ нарисовать повернутый img2d на g.

РЕДАКТИРОВАТЬ: у меня есть несколько объектов, которые рисуются на g, поэтому я не могу повернуть это. Мне нужно иметь возможность вращать вещи по отдельности.

Ответы [ 3 ]

34 голосов
/ 07 февраля 2011

Может быть, вам стоит попробовать AffineTransform вот так:

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

Надеюсь, это поможет.

19 голосов
/ 07 февраля 2011

Я бы использовал Graphics2D.drawImage (image, affinetranform, imageobserver) .

В приведенном ниже примере кода поворачивается и переводится изображение в центр компонента.Это скриншот результата:

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);
}
4 голосов
/ 07 февраля 2011

Вы вращаете графику для рисования на вашем изображении, а не на изображении.Вот почему вы не видите эффекта.Примените вращение к графике, на которой вы рисуете, и оно будет рисовать повернутое изображение:

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

Это, вероятно, будет отображать не совсем то, что вы ожидаете, вращение будет вращаться вокруг начала координат.Чтобы изображение вращалось вокруг его центра, перед поворотом необходимо применить перемещение координат, например:

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

В учебнике Graphics2D есть еще несколько примеров.

...