【问题标题】:Rotating BufferedImage in Java在 Java 中旋转 BufferedImage
【发布时间】:2020-01-30 19:49:18
【问题描述】:

我一直在尝试使用 for 循环来旋转图像。我的代码确实有效,但这种方法似乎没有必要,并且图像在旋转时会丢失像素。有没有更简单的方法来做到这一点?

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

【问题讨论】:

  • 可能重复 Rotate a buffered image in Java。这不使用像素操作,而是使用AffineTransform - 这个例子和其他答案之间的区别?它将调整图像的大小以使内容适合,这似乎是您所缺少/正在寻找的

标签: java for-loop methods graphics bufferedimage


【解决方案1】:

我创建了一个简单的示例程序(改编自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);
    }
}

【讨论】:

  • 这实际上并不是在旋转图像(这似乎是问题的关键),它是在旋转用于绘制图像的图形上下文
  • 另外,不要“重复”已经说过的内容,如果问题实际上是重复的,则应将其标记为这样
【解决方案2】:

尝试使用AffineTransform

获取一个旋转的实例

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

或直接drawing

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

【讨论】:

  • 一件事 - 您需要调整目标图像的大小,以便旋转后的源图像适合而不剪切原始图像
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多