???????渽????????java????
1 package com.jebysun.test.imagefind;
2
3 import java.awt.AWTException;
4 import java.awt.Rectangle;
5 import java.awt.Robot;
6 import java.awt.Toolkit;
7 import java.awt.image.BufferedImage;
8 import java.io.File;
9 import java.io.IOException;
10
11 import javax.imageio.ImageIO;
12 /**
13  * ?????????????
14  * @author Jeby Sun
15  * @date 2014-09-13
16  * @website http://www.jebysun.com
17  */
18 public class ImageFindDemo {
19
20     BufferedImage screenShotImage;    //??????
21     BufferedImage keyImage;           //?????????
22
23     int scrShotImgWidth;              //?????????
24     int scrShotImgHeight;             //?????????
25
26     int keyImgWidth;                  //????????????
27     int keyImgHeight;                 //????????????
28
29     int[][] screenShotImageRGBData;   //??????RGB????
30     int[][] keyImageRGBData;          //?????????RGB????
31
32     int[][][] findImgData;            //??????????????λ???????????????????
33
34
35     public ImageFindDemo(String keyImagePath) {
36         screenShotImage = this.getFullScreenShot();
37         keyImage = this.getBfImageFromPath(keyImagePath);
38         screenShotImageRGBData = this.getImageGRB(screenShotImage);
39         keyImageRGBData = this.getImageGRB(keyImage);
40         scrShotImgWidth = screenShotImage.getWidth();
41         scrShotImgHeight = screenShotImage.getHeight();
42         keyImgWidth = keyImage.getWidth();
43         keyImgHeight = keyImage.getHeight();
44
45         //???????
46         this.findImage();
47
48     }
49
50     /**
51      * ??????
52      * @return ????BufferedImage
53      */
54     public BufferedImage getFullScreenShot() {
55         BufferedImage bfImage = null;
56         int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
57         int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
58         try {
59             Robot robot = new Robot();
60             bfImage = robot.createScreenCapture(new Rectangle(0?? 0?? width?? height));
61         } catch (AWTException e) {
62             e.printStackTrace();
63         }
64         return bfImage;
65     }
66
67     /**
68      * ????????????????
69      * @param keyImagePath - ??·??
70      * @return ????????BufferedImage????
71      */
72     public BufferedImage getBfImageFromPath(String keyImagePath) {
73         BufferedImage bfImage = null;
74         try {
75             bfImage = ImageIO.read(new File(keyImagePath));
76         } catch (IOException e) {
77             e.printStackTrace();
78         }
79         return bfImage;
80     }
81
82     /**
83      * ????BufferedImage?????RGB????
84      * @param bfImage
85      * @return
86      */
87     public int[][] getImageGRB(BufferedImage bfImage) {
88         int width = bfImage.getWidth();
89         int height = bfImage.getHeight();
90         int[][] result = new int[height][width];
91         for (int h = 0; h < height; h++) {
92             for (int w = 0; w < width; w++) {
93                 //???getRGB(w?? h)?????????????ARGB????????????????????RGB???????????ARGB?????RGB????bufImg.getRGB(w?? h) & 0xFFFFFF??
94                 result[h][w] = bfImage.getRGB(w?? h) & 0xFFFFFF;
95             }
96         }
97         return result;
98     }
99
100
101     /**
102      * ??????
103      */
104     public void findImage() {
105         findImgData = new int[keyImgHeight][keyImgWidth][2];
106         //???????????????????
107         for(int y=0; y<scrShotImgHeight-keyImgHeight; y++) {
108             for(int x=0; x<scrShotImgWidth-keyImgWidth; x++) {
109                 //???????????磬?????????????????????????????
110                 //?ж?????????????????B??????????????????????
111                 //???????????????????Χ??????е?????????????е????б???
112                 if((keyImageRGBData[0][0]^screenShotImageRGBData[y][x])==0
113                         && (keyImageRGBData[0][keyImgWidth-1]^screenShotImageRGBData[y][x+keyImgWidth-1])==0
114                         && (keyImageRGBData[keyImgHeight-1][keyImgWidth-1]^screenShotImageRGBData[y+keyImgHeight-1][x+keyImgWidth-1])==0
115                         && (keyImageRGBData[keyImgHeight-1][0]^screenShotImageRGBData[y+keyImgHeight-1][x])==0) {
116
117                     boolean isFinded = isMatchAll(y?? x);
118                     //?????????????????????????????????????λ????????????????????顣
119                     if(isFinded) {
120                         for(int h=0; h<keyImgHeight; h++) {
121                             for(int w=0; w<keyImgWidth; w++) {
122                                 findImgData[h][w][0] = y+h;
123                                 findImgData[h][w][1] = x+w;
124                             }
125                         }
126                         return;
127                     }
128                 }
129             }
130         }
131     }
132
133     /**
134      * ?ж????????????????Χ????????????????С???????????
135      * @param y - ????????????????????????????y????
136      * @param x - ????????????????????????????x????
137      * @return
138      */
139     public boolean isMatchAll(int y?? int x) {
140         int biggerY = 0;
141         int biggerX = 0;
142         int xor = 0;
143         for(int smallerY=0; smallerY<keyImgHeight; smallerY++) {
144             biggerY = y+smallerY;
145             for(int smallerX=0; smallerX<keyImgWidth; smallerX++) {
146                 biggerX = x+smallerX;
147                 if(biggerY>=scrShotImgHeight || biggerX>=scrShotImgWidth) {
148                     return false;
149                 }
150                 xor = keyImageRGBData[smallerY][smallerX]^screenShotImageRGBData[biggerY][biggerX];
151                 if(xor!=0) {
152                     return false;
153                 }
154             }
155             biggerX = x;
156         }
157         return true;
158     }
159
160     /**
161      * ??????????????????
162      */
163     private void printFindData() {
164         for(int y=0; y<keyImgHeight; y++) {
165             for(int x=0; x<keyImgWidth; x++) {
166                 System.out.print("("+this.findImgData[y][x][0]+"?? "+this.findImgData[y][x][1]+")");
167             }
168             System.out.println();
169         }
170     }
171
172
173     public static void main(String[] args) {
174         String keyImagePath = "D:/key.png";
175         ImageFindDemo demo = new ImageFindDemo(keyImagePath);
176         demo.printFindData();
177     }
178
179 }
???????????????????????????????в???????????????????????????????????????????и??·????????????4??????Χ?????????????????????????90%????????????????????0.9??
??????????????????Ч?????????????????????ó????в????????Ч?????????????????????£???????????и???????????????