【Selenium-WebDriver实战篇】Java丨验证码图片去除干扰像素,方便验证码的识别(转)

参考地址:https://www.cnblogs.com/haojieli/p/6212627.html

1、先来看看效果:

原图

除去干扰像素后

2、解析代码:

1)、读取文件夹里面的图片

1 String fileName = "picture";
2 BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg"));

2)、获取图片的宽度和高度

1 int width = img.getWidth();
2 int height = img.getHeight();

3)、循环执行除去干扰像素

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

4)、图片背景变黑,验证码变白色

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

5)、保存图片

 1      File file = new File("img\\temp\\"+fileName+".jpg");
 2         if (!file.exists())
 3         {
 4             File dir = file.getParentFile();
 5             if (!dir.exists())
 6             {
 7             dir.mkdirs();
 8             }
 9             try
10             {
11             file.createNewFile();
12             }
13             catch (IOException e)
14             {
15             e.printStackTrace();
16             }
17         }
18         ImageIO.write(img, "jpg", file);

3、重要代码:

BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg"));

Color color1 = new Color(img.getRGB(i, 1));
int num1 = color1.getRed()+color1.getGreen()+color1.getBlue();
getRed()、getGreen()、getBlue()这三个方法分别是获取图片每一个像素的三原色(注释:每一种颜色都是由红、绿、蓝组成的)

4、原理:

1)、获取图片的高度和宽度2)、循环获取图片的每一个像素的值3)、把每一排的像素值用来作为对比的标准从而替代颜色相同的为白色(横向和纵向都可以循环一次,这里我只循环了横向的像素)4)、循环获取像素,替代验证码背景为黑色(在这个步骤验证码的背景已经是白色的,数字的颜色还没有替换,所以我们循环一次把白色换为黑色,不是白色的换成白色)

5、所有代码:

 1 package com.haojieli.main;
 2
 3 import java.awt.Color;
 4 import java.awt.image.BufferedImage;
 5 import java.io.File;
 6 import java.io.IOException;
 7
 8 import javax.imageio.ImageIO;
 9
10 public class PictureRemove {
11
12     public static void main(String[] args) throws IOException {
13         //读取文件夹里面的图片
14         String fileName = "picture";
15         BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg"));
16         //获取图片的高宽
17         int width = img.getWidth();
18         int height = img.getHeight();
19
20         //循环执行除去干扰像素
21         for(int i = 1;i < width;i++){
22             Color colorFirst = new Color(img.getRGB(i, 1));
23             int numFirstGet = colorFirst.getRed()+colorFirst.getGreen()+colorFirst.getBlue();
24             for (int x = 0; x < width; x++)
25             {
26                 for (int y = 0; y < height; y++)
27                 {
28                     Color color = new Color(img.getRGB(x, y));
29                     System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue());
30                     int num = color.getRed()+color.getGreen()+color.getBlue();
31                     if(num >= numFirstGet){
32                         img.setRGB(x, y, Color.WHITE.getRGB());
33                     }
34                 }
35             }
36         }
37
38         //图片背景变黑色
39         for(int i = 1;i<width;i++){
40             Color color1 = new Color(img.getRGB(i, 1));
41             int num1 = color1.getRed()+color1.getGreen()+color1.getBlue();
42             for (int x = 0; x < width; x++)
43             {
44                 for (int y = 0; y < height; y++)
45                 {
46                     Color color = new Color(img.getRGB(x, y));
47                     System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue());
48                     int num = color.getRed()+color.getGreen()+color.getBlue();
49                     if(num==num1){
50                         img.setRGB(x, y, Color.BLACK.getRGB());
51                     }else{
52                         img.setRGB(x, y, Color.WHITE.getRGB());
53                     }
54                 }
55             }
56         }
57         //保存图片
58         File file = new File("img\\temp\\"+fileName+".jpg");
59         if (!file.exists())
60         {
61             File dir = file.getParentFile();
62             if (!dir.exists())
63             {
64             dir.mkdirs();
65             }
66             try
67             {
68             file.createNewFile();
69             }
70             catch (IOException e)
71             {
72             e.printStackTrace();
73             }
74         }
75         ImageIO.write(img, "jpg", file);
76     }
77 }

以上代码只限于这类验证码  的干扰像素的去除 ,其他的验证码类型还待测试!

原文地址:https://www.cnblogs.com/conquerorren/p/11867090.html

时间: 2024-10-09 16:48:16

【Selenium-WebDriver实战篇】Java丨验证码图片去除干扰像素,方便验证码的识别(转)的相关文章

selenium webdriver学习篇①

Selenium是一个很不错的Web测试工具,使用灵活,简单,随着网站内容的增多,原始的人工测试越发的繁杂,而且经常有遗忘的地方, 自动化测试也就显得重要起来,这里记录一下selenium webdriver的学习过程 注:我是做java的,我只学习 java 与  Selenium WebDriver 配合的方法. 第一篇 Selenium IDE 对于新手而言,最开始可能会用Selenium IDE录制程序,但是熟悉之后,我更倾向于写代码做标准的功能测试,那还是首先讲一下Selenium I

《一头扎进》系列之Python+Selenium框架实战篇4- 价值好几K的框架,呵!这个框架有点意思啊!!!

1.简介 前面文章,我们实现了框架的一部分功能,包括日志类和浏览器引擎类的封装,今天我们继续封装一个基类和介绍如何实现POM.关于基类,是这样定义的:把一些常见的页面操作的selenium封装到base_page.py这个类文件,以后每个POM中的页面类,都继承这个基类,这样每个页面类都有基类的方法,这个我们会在这篇文章由宏哥实现. 2.项目层级结构 1. 上一篇中我们已经创建好了项目层级结构,具体项目层级结构如下图.这里不再赘述,相关文件也如下: 3. 定位和截图类封装 1. 在实现封装基类里

[转]java selenium webdriver实战 应用小结

原文链接:http://www.cnblogs.com/itliucheng/p/5578788.html 部分api 1.访问网站 driver.get("http://www.baidu.com"); 或者 driver.navigate().to("http://www.baidu.com"); 2.操作浏览器窗口 //声明一个point对象,两个150表示浏览器的位置相对于屏幕的左上角(0,0)的横坐标距离和纵坐标距离 Point point = new P

java selenium webdriver实战 页面元素定位

自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选择下拉列表中的那个下拉列表或者输入框中输入什么值 其中定位页面元素是三步骤的第一步,本篇介绍常用的定位方法 webDriver对象的findElement函数用于定位一个页面元素,findElements函数用户定位多个页面元素,定位的页面元素使用webElement对象进行存储 常用的方法有: 1

Struts2 验证码图片实例

本文分三个步骤介绍验证码图片生成以及与Struts2结合使用. Step 1.随机验证码 一步一步来,要生成验证码图片,首先要有验证码,然后才能在画在图片上.为了能够灵活控制验证码,特别编写了SecurityCode类,它向外提 供随机字符串.并且可以控制字符串的长度和难度.SecurityCode类中提供的验证码分三个难度,易(全数字).中(数字+小写英文).难(数字+ 大小写英文).难度使用枚举SecurityCodeLevle表示,避免使用1.2.3这样没有明确意义的数字来区分. 同时,还

用动态网页技术PHP生成验证码图片的源代码

文件a.php <? //checkNum.php session_start(); function random($len) { $srcstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; mt_srand(); $strs=""; for($i=0;$i<$len;$i++){ $strs.=$srcstr[mt_rand(0,35)]; } return strtoupper($strs); } $str=ra

第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证

Tornado框架-生成验证码图片,以及验证码结合Session验证 第一.生成验证码图片  生成验证码图片需要两个必须模块 1.python自带的random(随机模块) 2.Pillow()图像处理模块里的PIL(图像库),为第三方模块,需要安装 封装验证码图片生成插件py 在封装文件里先导入random(随机模块),和Pillow()图像处理模块里的所需py文件 封装验证码图片生成插件功能,调用后返回验证码图片,和字符串类型验证码,两个返回值 注意:验证码需要一个字体文件,这个字体文件必须

【零基础】Selenium:Webdriver图文入门教程java篇(附相关包下载)

一.selenium2.0简述 与一般的浏览器测试框架(爬虫框架)不同,Selenium2.0实际上由两个部分组成Selenium+webdriver,Selenium负责用户指令的解释(code),webdriver则负责对浏览器进行控制和页面解析.所以使用Selenium2.0时需要相应版本的webdriver和浏览器,程序运行过程中会通过webdriver启动一个真实的浏览器.由于webdriver+浏览器的组合,Selenium不存在对js.ajax解析的问题,它直接使用浏览器对网站代码

selenium WebDriver 截取网站的验证码

在做爬虫项目的时候,有时候会遇到验证码的问题,由于某些网站的验证码是动态生成的,即使是同一个链接,在不同的时间访问可能产生不同的验证码, 一 刚开始的思路就是打开这个验证码的链接,然后通过java代码get请求保存验证码图片到本地,然后用打码工具解析验证码,将验证码自动输入验证框就 可以把验证码的问题解决了,但是问题来,每次的请求同一个地址,产生的验证码图片是不一样的,所以这种方法行不通.所以只能将图片先用selenium  WebDriver 截取到本地,然后用打码工具解析ok ,自动填写验证