• 【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);
    	}
    
    }
    
  • 相关阅读:
    html+css 笔记
    JS随手笔记
    JQ几个淡入淡效果
    AngularJS编译阶段应分为两个阶段
    JavaScript 原型链的理解
    js继承的6种方式
    什么是跨域?跨域解决方法
    computed (计算属性) 和 methods (方法) 的区别
    谈谈vue生命周期
    基本类型有哪几种?null 是对象吗?基本数据类型和复杂数据类型存储有什么区别?
  • 原文地址:https://www.cnblogs.com/yezhechenyang/p/13677173.html
Copyright © 2020-2023  润新知