|
|
|
@ -0,0 +1,215 @@
|
|
|
|
|
package com.example.jmacro.wjdr.tool;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.log.StaticLog;
|
|
|
|
|
import com.example.jmacro.wjdr.util.Logger;
|
|
|
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
|
import java.awt.*;
|
|
|
|
|
import java.awt.event.KeyAdapter;
|
|
|
|
|
import java.awt.event.KeyEvent;
|
|
|
|
|
import java.awt.event.MouseAdapter;
|
|
|
|
|
import java.awt.event.MouseEvent;
|
|
|
|
|
import java.awt.event.MouseMotionAdapter;
|
|
|
|
|
import java.awt.event.WindowAdapter;
|
|
|
|
|
import java.awt.event.WindowEvent;
|
|
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 采集区域
|
|
|
|
|
*
|
|
|
|
|
* @author wangbing
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @since 1.8
|
|
|
|
|
*/
|
|
|
|
|
public class PickRect extends JFrame {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 参照原点x坐标
|
|
|
|
|
*/
|
|
|
|
|
private int originX;
|
|
|
|
|
/**
|
|
|
|
|
* 参照原点y坐标
|
|
|
|
|
*/
|
|
|
|
|
private int originY;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 全屏幕截图
|
|
|
|
|
*/
|
|
|
|
|
private BufferedImage capture;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 背景蒙层
|
|
|
|
|
*/
|
|
|
|
|
private final Color mask = new Color(0, 0, 0, 0.2f);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 聚焦框线条
|
|
|
|
|
*/
|
|
|
|
|
private final Stroke focusWindow = new BasicStroke(1.0f);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 屏幕截图区域起始坐标
|
|
|
|
|
*/
|
|
|
|
|
private final Point start = new Point(0, 0);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 屏幕截图区域结束坐标
|
|
|
|
|
*/
|
|
|
|
|
private final Point end = new Point(0, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 有参照原点的构造器
|
|
|
|
|
*
|
|
|
|
|
* @param originX 原点x
|
|
|
|
|
* @param originY 原点y
|
|
|
|
|
* @throws AWTException
|
|
|
|
|
*/
|
|
|
|
|
public PickRect(int originX, int originY) throws AWTException {
|
|
|
|
|
this();
|
|
|
|
|
this.originX = originX;
|
|
|
|
|
this.originY = originY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PickRect() throws AWTException {
|
|
|
|
|
init();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void init() throws AWTException {
|
|
|
|
|
setExtendedState(Frame.MAXIMIZED_BOTH);
|
|
|
|
|
setLocation(0, 0);//位置
|
|
|
|
|
setUndecorated(true);
|
|
|
|
|
setAlwaysOnTop(true);
|
|
|
|
|
setBackground(mask);
|
|
|
|
|
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
|
|
|
|
|
|
|
|
|
|
// 获取屏幕截图
|
|
|
|
|
Robot robot = new Robot();
|
|
|
|
|
Toolkit tk = Toolkit.getDefaultToolkit();
|
|
|
|
|
capture = robot.createScreenCapture(new Rectangle(0, 0, tk.getScreenSize().width, tk.getScreenSize().height));
|
|
|
|
|
|
|
|
|
|
// 监听窗口关闭
|
|
|
|
|
addWindowListener(new WindowAdapter() {
|
|
|
|
|
@Override
|
|
|
|
|
public void windowClosing(WindowEvent e) {
|
|
|
|
|
// 关闭应用时要释放资源
|
|
|
|
|
dispose();
|
|
|
|
|
System.exit(0);//0正常退出,1非正常退出
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
addMouseListener(new MouseAdapter() {
|
|
|
|
|
@Override
|
|
|
|
|
public void mousePressed(MouseEvent e) {
|
|
|
|
|
super.mousePressed(e);
|
|
|
|
|
start.setLocation(e.getX(), e.getY());
|
|
|
|
|
end.setLocation(e.getX(), e.getY());
|
|
|
|
|
Logger.info("起始坐标:{}", start);
|
|
|
|
|
repaint();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void mouseReleased(MouseEvent e) {
|
|
|
|
|
super.mouseReleased(e);
|
|
|
|
|
end.setLocation(e.getX(), e.getY());
|
|
|
|
|
|
|
|
|
|
int left = getCaptureX();
|
|
|
|
|
int top = getCaptureY();
|
|
|
|
|
int right = getCaptureX() + getCaptureWidth();
|
|
|
|
|
int bottom = getCaptureY() + getCaptureHeight();
|
|
|
|
|
Logger.info("=========================区域采集=========================");
|
|
|
|
|
Logger.info("屏幕区域:[{},{},{},{}]", left, top, right, bottom);
|
|
|
|
|
Logger.info("相对区域:[{},{},{},{}]", left - originX, top - originY, right - originX, bottom - originY);
|
|
|
|
|
|
|
|
|
|
Logger.info("用法示例:");
|
|
|
|
|
Logger.info("1、区域点击:mouseLeftClick(of({},{},{},{}));", left - originX, top - originY, right - originX, bottom - originY);
|
|
|
|
|
Logger.info("2、区域查找:findLegend(of({},{},{},{}), \"按钮\", 0.99);", left - originX, top - originY, right - originX, bottom - originY);
|
|
|
|
|
|
|
|
|
|
Logger.info("=========================区域采集=========================");
|
|
|
|
|
close();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
addMouseMotionListener(new MouseMotionAdapter() {
|
|
|
|
|
@Override
|
|
|
|
|
public void mouseDragged(MouseEvent e) {
|
|
|
|
|
super.mouseDragged(e);
|
|
|
|
|
end.setLocation(e.getX(), e.getY());
|
|
|
|
|
repaint();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
addKeyListener(new KeyAdapter() {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void keyReleased(KeyEvent e) {
|
|
|
|
|
switch (e.getKeyCode()) {
|
|
|
|
|
case KeyEvent.VK_ESCAPE: {
|
|
|
|
|
StaticLog.info("exit.");
|
|
|
|
|
close();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
setVisible(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doLayout() {
|
|
|
|
|
super.doLayout();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void paint(Graphics g) {
|
|
|
|
|
super.paint(g);
|
|
|
|
|
Graphics2D g2d = (Graphics2D) g;
|
|
|
|
|
g2d.drawImage(capture, 0, 0, capture.getWidth(), capture.getHeight(), this);
|
|
|
|
|
|
|
|
|
|
// 在背景图上加个蒙层
|
|
|
|
|
g2d.setColor(mask);
|
|
|
|
|
g2d.fillRect(0, 0, capture.getWidth(), capture.getHeight());
|
|
|
|
|
|
|
|
|
|
int w = getCaptureWidth();
|
|
|
|
|
int h = getCaptureHeight();
|
|
|
|
|
if (w > 0 && h > 0) {
|
|
|
|
|
g2d.setStroke(focusWindow);
|
|
|
|
|
g2d.setColor(Color.green);
|
|
|
|
|
g2d.drawRect(getCaptureX(), getCaptureY(), w, h);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getCaptureX() {
|
|
|
|
|
return (int) Math.min(start.getX(), end.getX());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getCaptureY() {
|
|
|
|
|
return (int) Math.min(start.getY(), end.getY());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getCaptureWidth() {
|
|
|
|
|
return (int) Math.abs(start.getX() - end.getX());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int getCaptureHeight() {
|
|
|
|
|
return (int) Math.abs(start.getY() - end.getY());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void close() {
|
|
|
|
|
setVisible(false);
|
|
|
|
|
dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 工具入口
|
|
|
|
|
*
|
|
|
|
|
* @param args
|
|
|
|
|
* @throws AWTException
|
|
|
|
|
*/
|
|
|
|
|
public static void main(String[] args) throws AWTException {
|
|
|
|
|
// 运行坐标图例截图工具
|
|
|
|
|
new PickRect(5, 5);
|
|
|
|
|
}
|
|
|
|
|
}
|