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

Java 實現屏幕截圖功能:Robot 類完整應用指南

     編輯:Java 相關知識

前言

Java AWT 包中的 Robot 類提供了模擬鍵盤鼠標操作與屏幕捕獲能力。本文詳細講解如何利用 Robot.createScreenCapture() 實現全屏截圖,並封裝為可復用的 ScreenCapture 工具類,支援 PNG/JPG 格式、自定義文件名前綴與序號自增。

核心 API 解析

  • Toolkit.getDefaultToolkit().getScreenSize():獲取屏幕分辨率 (寬、高)。
  • new Robot().createScreenCapture(Rectangle):按指定矩形區域捕獲屏幕像素,返回 BufferedImage。
  • ImageIO.write(image, format, file):將圖像編碼寫入文件,支援 "png"、"jpg"、"bmp" 等格式。

完整工具類實現

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

public class ScreenCapture {
    private final String prefix;
    private final String format;
    private final Dimension screenSize;
    private int serial = 0;

    public ScreenCapture() {
        this("ScreenShot", "png");
    }

    public ScreenCapture(String prefix, String format) {
        this.prefix = prefix;
        this.format = format.toLowerCase();
        this.screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    }

    /** 執行截圖並保存 */
    public File snapShot() throws AWTException, IOException {
        // 1. 捕獲全屏
        Rectangle bounds = new Rectangle(0, 0, screenSize.width, screenSize.height);
        BufferedImage screenshot = new Robot().createScreenCapture(bounds);

        // 2. 生成文件名
        serial++;
        String fileName = String.format("%s_%03d.%s", prefix, serial, format);
        File output = new File(fileName);

        // 3. 寫入文件
        ImageIO.write(screenshot, format, output);
        System.out.println("Saved: " + output.getAbsolutePath());
        return output;
    }

    /** 批量截圖示例 */
    public static void main(String[] args) {
        try {
            ScreenCapture cap = new ScreenCapture("D:/demo/shot", "png");
            for (int i = 0; i < 3; i++) {
                cap.snapShot();
                Thread.sleep(1000); // 間隔 1 秒
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

關鍵細節與最佳實踐

  1. 異常處理:Robot 構造可能拋出 AWTException (無顯示設備/權限不足);ImageIO.write 可能拋出 IOException。
  2. 多屏幕環境:getScreenSize() 僅返回主屏幕尺寸。多顯示器需使用 GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() 遍歷所有屏幕邊界。
  3. 高 DPI 縮放:Windows 高 DPI 下截圖可能模糊,需在啟動參數添加 -Dsun.java2d.uiScale=1.0 或配置清單文件聲明 DPI 感知。
  4. 性能優化:頻繁截圖時,復用 Robot 實例與 Rectangle 對象,避免重複創建。
  5. 格式選擇:PNG 無損壓縮適合界面截圖;JPG 有損壓縮體積較小,適合照片類畫面。

擴展應用場景

  • 自動化測試截圖:測試失敗時自動捕獲當前屏幕狀態用於定位問題。
  • 桌面錄製前幀提取:定時截圖序列合成 GIF/視頻。
  • 遠程桌面預覽:服務端定期截圖壓縮傳輸給客戶端展示。
  • OCR 文字識別預處理:截取特定區域圖像送入 Tesseract 等引擎識別。

總結

Java Robot 類提供了跨平台的原生屏幕捕獲能力,配合 ImageIO 即可構建輕量級截圖工具。掌握其核心 API 與常見坑點 (多屏、高 DPI、權限),即可在自動化測試、監控錄製、輔助工具開發中靈活應用。

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