Java:围绕中心旋转图片失败求助(非BufferedImage方案)
图片绕中心旋转问题的解决方法
你的代码核心问题是旋转操作会影响整个Graphics2D上下文的后续绘制,而且中心点计算错误、绘制顺序也有问题,以下是修正方案:
问题点梳理
g2d.rotate()会改变整个画布的坐标系,后续所有绘制(包括你的黑色矩形)都会跟着旋转- 旋转中心点计算错误:你把图片的宽高搞反了,而且没有考虑图片实际绘制的尺寸(你是缩放到500x500绘制的,不是用原尺寸)
- 最后调用
fillRect把之前绘制的图片全覆盖了 - 每次重绘都重新加载图片,效率极低
修正后的代码
package package3; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class Rotate extends JPanel { public static void main(String[] args) { new Rotate().go(); } public void go() { JFrame frame = new JFrame("Rotate"); MyDrawPanel p = new MyDrawPanel(); frame.add(p); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1000, 1000); frame.setVisible(true); } class MyDrawPanel extends JPanel{ private Image image; // 提前加载图片,避免每次重绘重复加载 public MyDrawPanel() { image = new ImageIcon(getClass().getResource("wheel.png")).getImage(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 调用父类方法清理画布 Graphics2D g2d = (Graphics2D) g; // 先绘制原始图片(可选,对比用) g2d.drawImage(image, 0, 0, 500, 500, this); // 保存当前画布状态,避免旋转影响后续绘制 g2d.save(); // 计算旋转中心点:图片绘制区域的中心(0,0到500,500的中心是250,250) int centerX = 250; int centerY = 250; // 旋转1弧度(约57度),如果要转90度用Math.PI/2 g2d.rotate(1, centerX, centerY); // 绘制旋转后的图片,注意绘制位置还是(0,0),因为旋转中心已经是图片区域的中心 g2d.drawImage(image, 0, 0, 500, 500, this); // 恢复画布原有状态,后续绘制不再受旋转影响 g2d.restore(); // 绘制验证矩形,此时不会跟着旋转 g2d.setColor(Color.BLACK); g2d.drawRect(550, 0, 500, 500); } } }
关键修改说明
- 提前加载图片:把图片加载放到构造方法,避免每次重绘都读取资源
- save()和restore():这两个方法是核心,用来保存旋转前的画布状态,旋转绘制完成后恢复,这样只有目标图片会被旋转,后续绘制不受影响
- 正确计算旋转中心:因为你把图片缩放到500x500绘制在(0,0)位置,所以中心点是250,250,不是图片原尺寸的一半
- 调用super.paintComponent(g):确保每次重绘都清理画布,避免残留之前的绘制内容
- 调整绘制顺序:去掉了覆盖图片的
fillRect,换成了旁边的验证矩形,方便你看效果
内容的提问来源于stack exchange,提问作者riar
相关产品推荐
相关产品推荐

