java实现滑动验证码_selenium(java)实现滑动图片验证码

/**

*

* 搜索图片位子

* @param 二值化之后的背景图

* @param 二值化之后的校验图

* @return

* @throws IOException

*/

public int searchLocation(File bgImgBinaryFile,File verifyBinaryImgFile) throws IOException {

BufferedImage bgImg = ImageIO.read(bgImgBinaryFile);

BufferedImage vrImg = ImageIO.read(verifyBinaryImgFile);

int[][] bgRgb=getImageGRB(bgImg);

int[][] vrRgb=getImageGRB(vrImg);

return searchImage(bgRgb,vrRgb);

}

/**

* 这里非黑即白 值为0或1,1表示白色,0表示黑色

* @param bfImage

* @return

*/

public static int[][] getImageGRB(BufferedImage bfImage) {

int width = bfImage.getWidth();

int height = bfImage.getHeight();

int[][] result = new int[height][width];//这里就是y,x才跟图一样

for (int h = 0; h < height; h ) {

for (int w = 0; w

result[h][w] = getZeroOrOne(bfImage.getRGB(w, h));

System.out.print(result[h][w] ' ');

}

System.out.println();

}

System.out.println('===================================');

return result;

}

/**

* 将图片像素变成0或1,阈值可以根据实际情况调整

* @param bfImage

* @return

*/

private static int getZeroOrOne(int i) {

int rgb =i& 0xFFFFFF;

int r=(rgb& 0xff0000) >> 16;

int g=(rgb& 0xff00) >> 8;

int b=(rgb& 0xff);

if(r>210&g>210&b>210) {

return 1;

}

return 0x00;

}

/**

* 遍历图片,进行比较,得出相似度最高的位置

这里是一个像素一个像素去比较的,具体比较方法为compare(y,x,bgRgb,vrRgb)

* @param bfImage

* @return

*/

private static int searchImage(int[][] bgRgb,int[][] vrRgb) {

int bgY=bgRgb.length;

int bgX=bgRgb[0].length;

int vrY=vrRgb.length;

int vrX=vrRgb[0].length;

int xLocation=0;

int yLocation=0;

int maxCount=0;

for(int y=1;y

for(int x=1;x

int count=compare(y,x,bgRgb,vrRgb);

if(count>maxCount) {

maxCount=count;

yLocation=y;

xLocation=x;

}

}

}

LOGGER.info('最佳位置为({},{}),相同数比例为={}',new Object[] {xLocation,yLocation,maxCount});

return xLocation;

}

/**

* 针对背景图中的像素位置(Y,X),那验证图与原图做比较

1、比较边框,及比较验证图中值为1的点

2、争夺当前验证图中1的点,比较它四周的节点,是否相同,相同就相似度加一

PS:其实就是比较框框

* @param bfImage

* @return

*/

private static int compare(int bgY,int bgX,int[][] bgRgb,int[][] vrRgb) {

int count=0;

int vrY=vrRgb.length;

int vrX=vrRgb[0].length;

//遍历小图节点

for(int y=0;y

for(int x=0;x

//只对1做比较

if(vrRgb[y][x]!=1){

continue;

}

boolean isRight=true;

//比较当前点四周的节点是否相同

for(int i=-1;i<2;i ) {

for(int j=-1;j<2;j ) {

int tempX=x i;

int tempY=y j;

int tempBgY=y bgY j;

int tempBgX=x bgX i;

if(tempY<0||tempX<0||tempY>vrY-1||tempX>vrX-1) {

continue;

}

if(tempBgY<0||tempBgX<0||tempBgY>bgRgb.length-1||tempBgX>bgRgb[0].length-1) {

continue;

}

if(vrRgb[tempY][tempX]!=bgRgb[tempBgY][tempBgX]) {

isRight=false;

}

}

}

if(isRight) {

count ;

}

}

}

return count;

}

你可能感兴趣的:(java实现滑动验证码)