原理:截图+图片比较,调用第三方库实现全局热键
首先是截图部分
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
BufferedImage screenshot = null;
try {
screenshot = (new Robot())
.createScreenCapture(new Rectangle(0, 0, (int) d
.getWidth(), (int) d.getHeight()));
} catch (AWTException e1) {
e1.printStackTrace();
}
ByteArrayOutputStream f1=new ByteArrayOutputStream();
try {
ImageIO.write(screenshot, format_jpg, f1);
Iterator<ImageReader> readers = ImageIO
.getImageReadersByFormatName(format_jpg);
ImageReader reader = readers.next();
InputStream source = new ByteArrayInputStream(f1.toByteArray());
ImageInputStream iis = ImageIO
.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
ImageReadParam param2 = reader.getDefaultReadParam();
//截取图片
Rectangle rect1 = new Rectangle(computeRalitiveX(8), computeRalitiveY(192), computeRalitiveX(498), computeRalitiveY(448));
Rectangle rect2 = new Rectangle(computeRalitiveX(517), computeRalitiveY(192), computeRalitiveX(498), computeRalitiveY(448));
param.setSourceRegion(rect1);
BufferedImage bi = reader.read(0, param);
param2.setSourceRegion(rect2);
BufferedImage bi2 = reader.read(0, param2);
ByteArrayOutputStream p1 = new ByteArrayOutputStream();
ImageIO.write(bi, format_jpg, p1);
ByteArrayInputStream p1in = new ByteArrayInputStream(p1.toByteArray());
panel.addImagePath(p1in);
p1.close();
p1in.close();
ByteArrayOutputStream p2 = new ByteArrayOutputStream();
ImageIO.write(bi2, format_jpg, p2);
ByteArrayInputStream p2in = new ByteArrayInputStream(p2.toByteArray());
p2.close();
p2in.close();
source.close();
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
然后是图片比较部分,也就是说在相同位置能否找到一样的颜色。
public static int isSameInRange(int img1_x, int img1_y, int x, int y, int r,
BufferedImage bi, BufferedImage bi2) {
int minX = x;
int maxX = x + r;
if (x + r > bi2.getWidth())
maxX = bi2.getWidth();
if (x - r < 0)
minX = 0;
int minY = y;
int maxY = y + r;
if (y + r > bi2.getHeight())
maxY = bi2.getHeight();
if (y - r < 0)
minY = 0;
int result = Integer.MAX_VALUE;
for (int j = minY; j < maxY; j++) {
for (int i = minX; i < maxX; i++) {
byte r1 = (byte) (bi.getRGB(img1_x, img1_y) >> 24);
byte g1 = (byte) (bi.getRGB(img1_x, img1_y) >> 16);
byte b1 = (byte) (bi.getRGB(img1_x, img1_y) >> 8);
byte gr1 = (byte) (bi.getRGB(img1_x, img1_y));
byte r2 = (byte) (bi2.getRGB(i, j) >> 24);
byte g2 = (byte) (bi2.getRGB(i, j) >> 16);
byte b2 = (byte) (bi2.getRGB(i, j) >> 8);
byte gr2 = (byte) (bi2.getRGB(i, j));
int diff = Math.abs(r1 - r2) + Math.abs(g1 - g2)
+ Math.abs(b1 - b2) + Math.abs(gr1 - gr2);
result = result > diff ?diff : result;
}
}
return result;
}
好啦,最后是系统热键部分
String OS = System.getProperty( "sun.arch.data.model") ;
final PictureCompareWin own = this;
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
if(!OS.equals("64")){
JIntellitype.setLibraryLocation("lib/JIntellitype.dll");
}else{
JIntellitype.setLibraryLocation("lib/JIntellitype64.dll");
}
if(JIntellitype.checkInstanceAlreadyRunning("QQ Picture Compare"))
System.exit(1);
if(JIntellitype.isJIntellitypeSupported()){
JIntellitype.getInstance().registerHotKey(PRINT_SCREEN, 0,44);
JIntellitype.getInstance().addHotKeyListener(new HotkeyListener(){
public void onHotKey(int arg0) {
if(arg0==PRINT_SCREEN){
doCompare();
}
}
});
}
下面是演示效果
左边图像
右边图像
显示不同(蓝色部分)