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();
					}
					
				}
			});
		}

下面是演示效果

左边图像

右边图像


 显示不同(蓝色部分)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值