java swing 图像翻转

drawImage

public abstract boolean drawImage(Image img,
                                  int dx1,
                                  int dy1,
                                  int dx2,
                                  int dy2,
                                  int sx1,
                                  int sy1,
                                  int sx2,
                                  int sy2,
                                  ImageObserver observer)

这个重载版本的drawImage方法确实可以用来实现图像的翻转效果。它允许你从原始图像中选择一个区域,并将其绘制到目标位置,同时还能进行缩放、旋转或翻转

参数详解

这个方法的参数看起来很多,但其实可以分为两组:

目标区域参数

  • int dx1, int dy1:目标图像的左上角坐标
  • int dx2, int dy2:目标图像的右下角坐标

源图像区域参数

  • int sx1, int sy1:源图像中要绘制区域的左上角坐标
  • int sx2, int sy2:源图像中要绘制区域的右下角坐标

其他参数

  • ImageObserver observer:图像加载状态的观察者,可以传入null

图像翻转的原理

图像翻转主要通过交换源图像区域的坐标来实现:

  • 水平翻转:交换sx1sx2
  • 垂直翻转:交换sy1sy2
  • 对角线翻转:同时交换上述两组坐标
  • import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.File;
    import javax.imageio.ImageIO;
    
    public class ImageFlipDemo extends JPanel {
        private Image originalImage;    // 原始图像
        private Image flippedImage;     // 翻转后的图像
        private boolean horizontalFlip = false;  // 是否水平翻转
        private boolean verticalFlip = false;    // 是否垂直翻转
        
        public ImageFlipDemo() {
            try {
                // 加载图片(请确保路径正确)
                originalImage = ImageIO.read(new File("example.jpg"));
                // 如果没有图片,可以使用默认的图标
                if (originalImage == null) {
                    originalImage = new ImageIcon(getClass().getResource("/default.png")).getImage();
                }
            } catch (Exception e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(this, "无法加载图片");
            }
            
            // 创建按钮来控制翻转
            JButton hFlipButton = new JButton("水平翻转");
            hFlipButton.addActionListener(e -> {
                horizontalFlip = !horizontalFlip;
                repaint();  // 重绘面板
            });
            
            JButton vFlipButton = new JButton("垂直翻转");
            vFlipButton.addActionListener(e -> {
                verticalFlip = !verticalFlip;
                repaint();  // 重绘面板
            });
            
            // 添加按钮到面板
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(hFlipButton);
            buttonPanel.add(vFlipButton);
            
            // 设置主面板布局
            setLayout(new BorderLayout());
            add(buttonPanel, BorderLayout.NORTH);
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            if (originalImage != null) {
                int width = originalImage.getWidth(this);
                int height = originalImage.getHeight(this);
                
                // 计算源图像区域的坐标
                int sx1 = 0;
                int sy1 = 0;
                int sx2 = width;
                int sy2 = height;
                
                // 如果水平翻转,交换sx1和sx2
                if (horizontalFlip) {
                    int temp = sx1;
                    sx1 = sx2;
                    sx2 = temp;
                }
                
                // 如果垂直翻转,交换sy1和sy2
                if (verticalFlip) {
                    int temp = sy1;
                    sy1 = sy2;
                    sy2 = temp;
                }
                
                // 计算目标图像的坐标(居中显示)
                int dx1 = (getWidth() - width) / 2;
                int dy1 = (getHeight() - height) / 2;
                int dx2 = dx1 + width;
                int dy2 = dy1 + height;
                
                // 绘制原始图像(在左侧)
                g.drawImage(originalImage, 50, 100, this);
                g.drawString("原始图像", 50, 90);
                
                // 绘制翻转后的图像(在右侧)
                g.drawImage(originalImage, 
                            dx1, dy1, dx2, dy2,  // 目标区域
                            sx1, sy1, sx2, sy2,  // 源图像区域
                            this);
                    
                g.drawString("翻转后的图像", dx1, dy1 - 10);
            } else {
                g.drawString("图片未加载", 50, 50);
            }
        }
        
        public static void main(String[] args) {
            JFrame frame = new JFrame("图像翻转演示");
            ImageFlipDemo demo = new ImageFlipDemo();
            frame.add(demo);
            frame.setSize(800, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值