【Java】复盘截屏小例子

1. 前言

虽说有系统自带截屏(PrtScr),但还是想着如何用代码自己实现一个。

于是乎,便在网上找了个简单例子,然后落地实践。

2. 截屏小例

先说说大概思路:

  1. 使用第三方包JIntellitype注册全局热键;
  2. 使用JDK提供的Robot实现截屏;

先准备JIntellitype的两个dllJIntellitype.dllJIntellitype64.dll

官方Git仓库:https://github.com/melloware/jintellitype 传送门

两个dll所在仓库位置:jintellitype/src/main/resources/com/melloware/jintellitype/windows/ 传送门

在项目中自己单独创建一个包com.melloware.jintellitype,用来存放这两个dllJIntellitype会自动到这个包下寻找dll

下载JIntellitype.jar

<dependency>
    <groupId>com.melloware</groupId>
    <artifactId>jintellitype</artifactId>
    <version>1.3.9</version>
</dependency>

不是maven项目可以到专门的maven仓库下载,在这提供一个:https://maven.aliyun.com/mvn/search,自己搜索jintellitype

代码:

import java.awt.AWTException;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Optional;

import javax.imageio.ImageIO;

import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;

public class ScreenCaptureTest {
	private static final String DEFAULT_DIR = "C:\Users\Administrator\Desktop";

	public static void main(String[] args) {
		registryHotKey();
	}

	// 截屏
	public static void capture(String dir, String fileName) {

		// 获取屏幕的大小
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		// 创建矩形区域
		Rectangle screenRectangle = new Rectangle(screenSize);
		Robot robot;
		try {
			robot = new Robot();
			BufferedImage image = robot.createScreenCapture(screenRectangle); // 截取屏幕

			Optional<String> dirOptional = Optional.ofNullable(dir); // 接收图片存放目录参数,允许为空
			Optional<String> fileNameOptional = Optional.ofNullable(fileName); // 接收图片名称参数,允许为空

			File screenFile = new File(dirOptional.orElse(DEFAULT_DIR)); // 若未传目录参数,默认指定桌面
			if (!screenFile.exists()) { // 若目录不存在,则创建
				screenFile.mkdirs();
			}
			// 若未传文件名,则使用当前时间
			File f = new File(screenFile, fileNameOptional.orElse(getDateTimeStr() + ".png"));

			ImageIO.write(image, "png", f); // 将图片写入文件

			// 是否支持打开图片
			boolean isSupport = Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.OPEN);
			if (isSupport)
				Desktop.getDesktop().open(f);

		} catch (AWTException | IOException e) {
			e.printStackTrace();
		}

	}

	// 获取当前时间字符串
	public static String getDateTimeStr() {
		LocalDateTime currTime = LocalDateTime.now();
		return currTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
	}

	// 注册热键
	public static void registryHotKey() {
		/*
		 * 注册热键,第一个参数为序号,在添加监听时会用到 第二个参数为是否时组合键,为0时即非组合键
		 * 第三个参数为需要注册的按键,可以使用按键code或者直接char类型大写按键代替
		 */
		JIntellitype.getInstance().registerHotKey(1, 0, 27); // esc 结束程序
		JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_ALT, 'K'); // ALT + K 截屏

		/*
		 * 注册监听,case选项的值即为注册热键时热键的序号
		 */
		HotkeyListener hotkeyListener = new HotkeyListener() {
			public void onHotKey(int code) {
				switch (code) {
				case 1:
					System.out.println("esc");
					JIntellitype.getInstance().cleanUp(); // 按 esc 键结束程序
					break;
				case 2:
					System.out.println("alt + k");
					capture(null, null); // 按alt + k 键截屏
					break;
				}
			}
		};
		// 添加监听
		JIntellitype.getInstance().addHotKeyListener(hotkeyListener);
	}

}
原文地址:https://www.cnblogs.com/yezhechenyang/p/13677173.html