我这样子实现旋转,是以图片中心为轴进行旋转:import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.AffineTransform;
import javax.swing.*;
import javax.swing.event.*;//图像旋转演示public class RotateImageDemo extends JFrame{
    JSlider jSlider = new JSlider(JSlider.HORIZONTAL,0,180,0);  //设定旋转角度
    ImagePane imagePane=new ImagePane(); //绘制图像的面板
    
    public RotateImageDemo(){
        super("图像旋转演示"); //调用父类构造函数
        jSlider.setPaintTicks(true);  //绘制标志位    
        jSlider.setMajorTickSpacing(45); //设置标志尺寸
        jSlider.setMinorTickSpacing(5);
        jSlider.setPaintLabels(true); //绘制出数字
        jSlider.setBorder(new javax.swing.border.TitledBorder(BorderFactory.createEmptyBorder(), "图像的旋转度")); //设置边框
        jSlider.addChangeListener(new ChangeListener() { //滑动条jSlider事件处理
            public void stateChanged(ChangeEvent ce) {
                int value=((JSlider) ce.getSource()).getValue(); //获取设置值
                double angle =-(float)value/180*Math.PI ; //得到旋转角度(弧度制)
                imagePane.ratoteImage((float)angle); //旋转图像
            }
        });        
        
        Container container=getContentPane(); //得到窗口容器
        imagePane.loadImage("c:\\6.jpg");    //装载图片
        container.add(imagePane,BorderLayout.CENTER); //增加组件到容器上
        container.add(jSlider,BorderLayout.SOUTH);
        
        setSize(250,250); //设置窗口尺寸
        setVisible(true); //设置窗口可视
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     //关闭窗口时退出程序        
    }
    
    public static void main(String[] args){
        new RotateImageDemo();
    }
    
    class ImagePane extends JPanel {
        Image image;
        BufferedImage bufImage; //用于显示的缓冲区图像
        BufferedImage originalBufImage; //原始缓冲区图像
        Graphics2D bufImageG; //缓冲区图像的图形环境    
    
        public void loadImage(String fileName) {
            image = this.getToolkit().getImage(fileName); //取得图像
            MediaTracker mt = new MediaTracker(this); //实例化媒体加载器
            mt.addImage(image, 0); //增加图像到加载器中
            try {
                mt.waitForAll(); //等待图片加载
            } catch (Exception ex) {
                ex.printStackTrace();  //输出出错信息
            }
            originalBufImage =    new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);     //创建原始缓冲区图像
            bufImage = originalBufImage;
            bufImageG = bufImage.createGraphics(); //创建bufImage的图形环境
            bufImageG.drawImage(image, 0, 0, this); //传输源图像数据到缓冲区图像中
            repaint(); //重绘组件
        }
        //过滤图像
        public void ratoteImage(double angle) {
            if (bufImage == null)
                return; //如果bufImage为空则直接返回
            BufferedImage filteredBufImage =new BufferedImage(image.getWidth(this) ,image.getHeight(this),BufferedImage.TYPE_INT_ARGB); //过滤后的图像
            AffineTransform transform = new AffineTransform(); //仿射变换对象
            transform.rotate(angle,image.getWidth(this)/2,image.getHeight(this)/2); //旋转图像
            AffineTransformOp imageOp = new AffineTransformOp(transform, null);//创建仿射变换操作对象            
            imageOp.filter(originalBufImage, filteredBufImage);//过滤图像,目标图像在filteredBufImage
            bufImage = filteredBufImage; //让用于显示的缓冲区图像指向过滤后的图像
            repaint(); //重绘组件
        }
        
        //重载容器的paintComponent()方法
        public void paint(Graphics g) {
            super.paintComponent(g);
            if (bufImage != null) {
                Graphics2D g2 = (Graphics2D) g;
                g2.drawImage(bufImage,0,0,this);    //绘制图片
            }
        }
    }
}
不过有个问题就是当我旋转90度的时候发现有一部分是没显示出来的,我知道需要再进行平移操作,但不知道要怎么平移才行,请教各位!

解决方案 »

  1.   

    setSize(250,250); //设置窗口尺寸换这个   个人见解呵呵setSize(imagePane.image.getWidth(this)+10,imagePane.image.getHeight(this)+101); //设置窗口尺寸
      

  2.   

    改成这样吧:import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.MediaTracker;import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;//图像旋转演示public class RotateImageDemo extends JFrame{
        JSlider jSlider = new JSlider(JSlider.HORIZONTAL,0,180,0);  //设定旋转角度
        ImagePane imagePane=new ImagePane(); //绘制图像的面板
        
        public RotateImageDemo(){
            super("图像旋转演示"); //调用父类构造函数
            jSlider.setPaintTicks(true);  //绘制标志位    
            jSlider.setMajorTickSpacing(45); //设置标志尺寸
            jSlider.setMinorTickSpacing(5);
            jSlider.setPaintLabels(true); //绘制出数字
            jSlider.setBorder(new javax.swing.border.TitledBorder(BorderFactory.createEmptyBorder(), "图像的旋转度")); //设置边框
            jSlider.addChangeListener(new ChangeListener() { //滑动条jSlider事件处理
                public void stateChanged(ChangeEvent ce) {
                    int value=((JSlider) ce.getSource()).getValue(); //获取设置值
                    double angle =-(float)value/180*Math.PI ; //得到旋转角度(弧度制)
                    imagePane.ratoteImage((float)angle); //旋转图像
                }
            });        
            
            Container container=getContentPane(); //得到窗口容器
            imagePane.loadImage("c:\\6.jpg");    //装载图片
            container.add(imagePane,BorderLayout.CENTER); //增加组件到容器上
            container.add(jSlider,BorderLayout.SOUTH);
            
            setSize(250,250); //设置窗口尺寸
            setVisible(true); //设置窗口可视
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     //关闭窗口时退出程序        
        }
        
        public static void main(String[] args){
            new RotateImageDemo();
        }
        
        class ImagePane extends JPanel {
            Image image;
            double angle;
            public void loadImage(String fileName) {
                image = this.getToolkit().getImage(fileName); //取得图像
                MediaTracker mt = new MediaTracker(this); //实例化媒体加载器
                mt.addImage(image, 0); //增加图像到加载器中
                try {
                    mt.waitForAll(); //等待图片加载
                } catch (Exception ex) {
                    ex.printStackTrace();  //输出出错信息
                }
                repaint(); //重绘组件
            }
            //过滤图像
            public void ratoteImage(double angle) {
             this.angle=angle;
                repaint(); //重绘组件
            }
            
            //重载容器的paintComponent()方法
            public void paint(Graphics g) {
                super.paintComponent(g);
                if (image != null) {
                    Graphics2D g2 = (Graphics2D) g;
                    g2.rotate(angle,getWidth() / 2,getHeight() / 2);
                    g.drawImage(image,(getWidth()-image.getWidth(null))/2,(getHeight()-image.getHeight(null))/2,this);
                }
            }
        }
    }