我正在尝试旋转缓冲的Image
,并使用getImage()
方法返回缓冲的Image
(旋转的图像)。正在进行图像的旋转,但在保存时将图像保存为不旋转图像的状态。
初始化:
private BufferedImage transparentImage;
油漆组件:
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(RotationOfImage.value));
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(transparentImage, at, null);
repaint();
一种返回旋转缓冲图像的方法。
public BufferedImage getImage(){
return transparentImage;
}
基本上,您正在旋转组件的Graphics
上下文并为其绘制图像,这对原始图像没有影响。
相反,你应该旋转图像并绘制它,例如。。。
public BufferedImage rotateImage() {
double rads = Math.toRadians(RotationOfImage.value);
double sin = Math.abs(Math.sin(rads));
double cos = Math.abs(Math.cos(rads));
int w = transparentImage.getWidth();
int h = transparentImage.getHeight();
int newWidth = (int) Math.floor(w * cos + h * sin);
int newHeight = (int) Math.floor(h * cos + w * sin);
BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotated.createGraphics();
AffineTransform at = new AffineTransform();
at.translate((newWidth - w) / 2, (newHeight - h) / 2);
at.rotate(Math.toRadians(RotationOfImage.value), w / 2, h / 2);
g2d.setTransform(at);
g2d.drawImage(transparentImage, 0, 0, this);
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, newWidth - 1, newHeight - 1);
g2d.dispose();
}
然后你可以把它画成。。。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
BufferedImage rotated = rotateImage();
int x = (getWidth() - rotated.getWidth()) / 2;
int y = (getHeight() - rotated.getHeight()) / 2;
g2d.drawImage(rotated, x, y, this);
g2d.dispose();
}
现在,你可以优化它,这样你只会在角度改变时生成图像的旋转版本,但我将把它留给你
ps-我还没有测试过,但它是基于这个问题