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
图像翻转的原理
图像翻转主要通过交换源图像区域的坐标来实现:
- 水平翻转:交换
sx1
和sx2
- 垂直翻转:交换
sy1
和sy2
- 对角线翻转:同时交换上述两组坐标
-
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); } }