首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實作圖片裁剪功能:以滑鼠拖曳選取區域並儲存

     編輯:Java 相關知識

本文示範如何使用 Java Swing 與 AWT 實作互動式圖片裁剪工具。使用者可在視窗中載入圖片,透過滑鼠拖曳選取矩形區域,再利用 Robot 類別擷取螢幕畫面並儲存為檔案。完整程式碼包含自訂面板繪製圖片、滑鼠事件監聽、矩形繪製與影像擷取儲存。

核心架構與類別說明

  • CropImage (主類別):繼承 JFrame,實作 MouseListener 與 MouseMotionListener,負責視窗初始化、滑鼠事件處理、裁剪邏輯與螢幕擷取。
  • ImagePanel (內部類別):繼承 JPanel,覆寫 paintComponent 繪製載入的圖片。

關鍵步驟與程式碼片段

1. 匯入必要套件

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

2. 主類別結構與變數宣告

public class CropImage extends JFrame implements MouseListener, MouseMotionListener {
    int dragStatus = 0, c1, c2, c3, c4; // 滑鼠座標與拖曳狀態

    public static void main(String[] args) {
        new CropImage().start();
    }
    // ...

3. 初始化視窗與載入圖片

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);
}

4. 滑鼠事件處理:記錄座標與繪製選取框

@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);
}

5. 擷取螢幕區域並儲存

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.");
}

6. 圖片顯示面板

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),而非擷取螢幕。
  • 執行緒安全:Swing 元件更新應在事件派發執行緒(EDT)中進行,主程式啟動建議包裹在 SwingUtilities.invokeLater。
  • 錯誤處理:檔案路徑、圖片載入失敗、權限不足等情況需加強例外處理。

此範例展示了 Java GUI 事件處理與影像操作的基礎整合,適合作為桌面應用程式裁剪功能的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved