You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:围绕中心旋转图片失败求助(非BufferedImage方案)

图片绕中心旋转问题的解决方法

你的代码核心问题是旋转操作会影响整个Graphics2D上下文的后续绘制,而且中心点计算错误、绘制顺序也有问题,以下是修正方案:

问题点梳理

  1. g2d.rotate()会改变整个画布的坐标系,后续所有绘制(包括你的黑色矩形)都会跟着旋转
  2. 旋转中心点计算错误:你把图片的宽高搞反了,而且没有考虑图片实际绘制的尺寸(你是缩放到500x500绘制的,不是用原尺寸)
  3. 最后调用fillRect把之前绘制的图片全覆盖了
  4. 每次重绘都重新加载图片,效率极低

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:35:20