本文示範如何使用 Java Swing 與 AWT 實作互動式圖片裁剪工具。使用者可在視窗中載入圖片,透過滑鼠拖曳選取矩形區域,再利用 Robot 類別擷取螢幕畫面並儲存為檔案。完整程式碼包含自訂面板繪製圖片、滑鼠事件監聽、矩形繪製與影像擷取儲存。
JFrame,實作 MouseListener 與 MouseMotionListener,負責視窗初始化、滑鼠事件處理、裁剪邏輯與螢幕擷取。JPanel,覆寫 paintComponent 繪製載入的圖片。import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;
public class CropImage extends JFrame implements MouseListener, MouseMotionListener {
int dragStatus = 0, c1, c2, c3, c4; // 滑鼠座標與拖曳狀態
public static void main(String[] args) {
new CropImage().start();
}
// ...
public void start() {
ImagePanel im = new ImagePanel("F:\\Wallpaper\\wallpapers\\1.jpg");
add(im);
setSize(400, 400);
setVisible(true);
addMouseListener(this);
addMouseMotionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void mousePressed(MouseEvent e) {
repaint();
c1 = e.getX();
c2 = e.getY();
}
@Override
public void mouseDragged(MouseEvent e) {
repaint();
dragStatus = 1;
c3 = e.getX();
c4 = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
repaint();
if (dragStatus == 1) {
c3 = e.getX();
c4 = e.getY();
try {
draggedScreen(); // 執行裁剪儲存
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public void paint(Graphics g) {
super.paint(g);
int w = Math.abs(c1 - c3);
int h = Math.abs(c2 - c4);
g.drawRect(Math.min(c1, c3), Math.min(c2, c4), w, h);
}
public void draggedScreen() throws Exception {
int x = Math.min(c1, c3);
int y = Math.min(c2, c4);
int w = Math.abs(c1 - c3);
int h = Math.abs(c2 - c4);
Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h));
File savePath = new File("screen1.jpg");
ImageIO.write(img, "JPG", savePath);
System.out.println("Cropped image saved successfully.");
}
class ImagePanel extends JPanel {
private Image img;
public ImagePanel(String path) {
this(new ImageIcon(path).getImage());
}
public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null);
}
}
Robot.createScreenCapture 使用的是螢幕絕對座標,若視窗移動或被遮擋會導致擷取錯誤。實務上建議直接對原始 BufferedImage 進行裁剪(使用 getSubimage),而非擷取螢幕。SwingUtilities.invokeLater。此範例展示了 Java GUI 事件處理與影像操作的基礎整合,適合作為桌面應用程式裁剪功能的起點。