Java 旋转BuffereImage实例

Java 旋转BuffereImage实例,java,swing,rotation,bufferedimage,graphics2d,Java,Swing,Rotation,Bufferedimage,Graphics2d,我无法显示旋转的buffereImage。我认为旋转效果很好,但我不能把它画到屏幕上。我的代码: Class extends JPanel { BufferedImage img; int rotation = 0; public void paintComponent(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); img2d = img.createGraphics(

我无法显示旋转的
buffereImage
。我认为旋转效果很好,但我不能把它画到屏幕上。我的代码:

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
,因此我无法旋转该对象。我需要能够单独旋转对象。

也许您应该尝试使用
仿射变换
如下:

仿射变换=新仿射变换();
transform.rotate(弧度,buffereImage.getWidth()/2,buffereImage.getHeight()/2);
AffineTransformOp=新的AffineTransformOp(变换,AffineTransformOp.TYPE_双线性);
buffereImage=op.filter(buffereImage,null);

希望这有帮助。

您正在旋转图形以绘制图像,而不是图像。这就是为什么你看不到任何效果。将旋转应用于正在绘制的图形,它将绘制旋转后的图像:

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);
还有一些例子。

我将使用

下面的代码示例将图像旋转并转换到组件的中心。这是结果的屏幕截图:

publicstaticvoidmain(字符串[]args)引发IOException{
JFrame=新JFrame(“测试”);
frame.add(新的JComponent(){
BuffereImage image=ImageIO.read(
新网址(“http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
@凌驾
受保护组件(图形g){
超级组件(g);
//创建转换时,请注意转换会发生
//以相反的顺序(因此向后检查)
AffineTransform at=新的AffineTransform();
//4.将其平移到部件的中心
at.translate(getWidth()/2,getHeight()/2);
//3.进行实际旋转
旋转(数学PI/4);
//2.只是一个比例,因为这个图像很大
比例(0.5,0.5);
//1.平移对象,使其绕轴旋转
//中心(更简单:)
at.translate(-image.getWidth()/2,-image.getHeight()/2);
//画图像
Graphics2D g2d=(Graphics2D)g;
g2d.drawImage(image,at,null);
//继续绘制其他内容(未转换)
//...
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(400400);
frame.setVisible(true);
}

我想单独旋转BuffereImage,然后用图形绘制它。图形对象上还有其他不应旋转的内容。您可以在绘制图像后撤消图形的转换。@Durandal您确定
Graphics
有旋转方法吗?或者您的意思是
g2d.rotate()
?当文件不是正方形时,添加填充会扭曲文件。