java 版qq靓女找茬助手
java 版qq美女找茬助手
原理:截图+图片比较,调用第三方库实现全局热键
首先是截图部分
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(); } } }); }
下面是演示效果
左边图像
右边图像
显示不同(蓝色部分)