精华内容
下载资源
问答
  • Java 识别图片验证码

    千次阅读 2019-03-02 10:09:56
    import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; i...

    package com.demo.bobo;

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Date;

    import javax.imageio.ImageIO;

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.io.IOUtils;

    import com.asprise.ocr.Ocr;
    import com.asprise.util.ocr.OCR;

    public class ReadImg {
    public static void main(String[] args) throws IOException {
    HttpClient httpClient = new HttpClient();
    GetMethod getMethod = new GetMethod(“http://dz.bjjtgl.gov.cn/service/checkCode.do”);
    // GetMethod getMethod = new GetMethod(“https://dynamic.12306.cn/otsweb/passCodeAction.do?rand=sjrand”);
    int statusCode = httpClient.executeMethod(getMethod);
    if (statusCode != HttpStatus.SC_OK) {
    System.err.println("Method failed: " + getMethod.getStatusLine());
    return ;
    }
    String picName = “F:\img\”;
    File filepic=new File(picName);
    if(!filepic.exists())
    filepic.mkdir();
    File filepicF=new File(picName+new Date().getTime() + “.jpg”);
    InputStream inputStream = getMethod.getResponseBodyAsStream();
    OutputStream outStream = new FileOutputStream(filepicF);
    IOUtils.copy(inputStream, outStream);
    outStream.close();

    	Ocr.setUp(); // one time setup
    	Ocr ocr = new Ocr(); // create a new OCR engine
    	ocr.startEngine("eng", Ocr.SPEED_FASTEST); // English
    	String s = ocr.recognize(new File[] {filepicF},Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
    	System.out.println("Result: " + s);
    	System.out.println("图片文字为:" + s.replace(",", "").replace("i", "1").replace(" ", "").replace("'", "").replace("o", "0").replace("O", "0").replace("g", "6").replace("B", "8").replace("s", "5").replace("z", "2"));
    	// ocr more images here ...
    	ocr.stopEngine();
    }
    

    }
    注意:主要的jar包

    1.aocr.jar – 去Asprise官网下载最新jar包 http://asprise.com/royalty-free-library/java-ocr-for-windows-mac-linux-download.html

    2.commons-codec.jar

    3.commons-httpclient-3.1.jar

    4.commons-io.jar

    5.commons-logging-1.0.4.jar

    展开全文
  • 基于 Java 的简单图形验证码识别
  • java解析图片验证码

    热门讨论 2014-01-20 10:31:13
    java解析图片验证码
  • 包含5个识别图片验证码的类,分别对应不同5种不同的验证码 其中用了两种不同的实现方式(截取采样像素比对+Tesseract-OCR识别) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法实现)
  • 现在登录的时候都需要图片验证码,搞了好久终于识别到了,用的方法是第三方接口识别,先把图片验证码的截图保存到本地,再用第三方联众的接口。 1.下载联众的识别代码,地址https://www.jsdati.com/docs/sdk 2....

    现在登录的时候都需要图片验证码,搞了好久终于识别到了,用的方法是第三方接口识别,先把图片验证码的截图保存到本地,再用第三方联众的接口。
    1.下载联众的识别代码,地址https://www.jsdati.com/docs/sdk

    2.在代码中输入用户名密码,充值1元钱(能用很多次),先用本地的图片识别一下,测试识别到了

    3.把测试的登录页面,图片验证码截图保存到本地,再自动识别,登陆成功!将验证码截图保存到本地的代码

       WebElement pic = driver.findElement(By.id("aaa"));
    	BufferedImage verpic = ImageElement(driver,pic);
    	ImageIO.write(verpic, "png", new File("D:\\123.png"));
    	public static byte[] Screen(WebDriver driver){
    		return ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);
    	}
     	public static BufferedImage ImageElement(WebDriver driver,WebElement element) throws IOException{
     		Point location = element.getLocation();
     		BufferedImage im = ImageIO.read(new ByteArrayInputStream(Screen(driver)));
     		BufferedImage subim = im.getSubimage(location.getX(), location.getY(), element.getSize().getWidth(), element.getSize().getHeight());
     		return subim;
        }
    

    遇到的问题:
    在使用ImageIO的时候,提示ImageIO cannot be resolved。解决方法:项目点击右键–>Build Path–>Configure Build Path(把JRE remove)–>Add Library(JRE System Library)

    展开全文
  • 什么是 JavaConfig? 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? Spring Boot 中的监视器是什么? 如何在 Spring Boot 中禁用 Actuator 端点安全性? 如何在自定义端口上运行 Spring Boot 应用程序...

    一、Spring Boot 相关

    (1)SpringBoot 面试专题

    • 什么是 Spring Boot?
    • Spring Boot 有哪些优点?
    • 什么是 JavaConfig?
    • 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    • Spring Boot 中的监视器是什么?
    • 如何在 Spring Boot 中禁用 Actuator 端点安全性?
    • 如何在自定义端口上运行 Spring Boot 应用程序?
    • 什么是 YAML?
    • 如何实现 Spring Boot 应用程序的安全性?
    • 如何集成 Spring Boot 和 ActiveMQ?
    • 如何使用 Spring Boot 实现分页和排序?
    • 什么是 Swagger?你用 Spring Boot 实现了它吗?
    • 什么是 Spring Profiles?
    • 什么是 Spring Batch?
    • 什么是 FreeMarker 模板?
    • 如何使用 Spring Boot 实现异常处理?
    • 您使用了哪些 starter maven 依赖项?
    • 什么是 CSRF 攻击?
    • 什么是 WebSockets?
    • 什么是 AOP?
    • 什么是 Apache Kafka?
    • 我们如何监视所有 Spring Boot 微服务?

    SpringBoot 面试专题答案:

    [图片上传失败…(image-9a13b8-1606481756979)]

    (2)Spring Boot 核心技术-笔记

    1. Spring Boot入门
    2. 配置文件
    3. 日志
    4. Web开发
    5. Docker
    6. Spring Boot与数据访问
    7. 启动配置原理
    8. 自定义Starter

    [图片上传失败…(image-e28284-1606481756978)]

    二、Spring Cloud 相关

    (1)Spring Cloud 面试专题

    • 什么是 Spring Cloud?
    • 使用 Spring Cloud 有什么优势?
    • 服务注册和发现是什么意思?Spring Cloud 如何实现?
    • 负载平衡的意义什么?
    • 什么是 Hystrix?它如何实现容错?
    • 什么是 Hystrix 断路器?我们需要它吗?
    • 什么是 Netflix Feign?它的优点是什么?
    • 什么是 Spring Cloud Bus?我们需要它吗?

    Spring Cloud面试题答案:

    阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂

    (2)SpringCloud 参考指南

    1. 微服务简介
    2. Spring Cloud
    3. 使用Dokcer构建微服务

    阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂

    三、Nginx 相关

    (1)Nginx 面试专题

    • 请解释一下什么是 Nginx?
    • 请列举 Nginx 的一些特性。
    • 请列举 Nginx 和 Apache 之间的不同点
    • 请解释 Nginx 如何处理 HTTP 请求。
    • 在 Nginx 中,如何使用未定义的服务器名称来阻止处理请求?
    • 使用“反向代理服务器”的优点是什么?
    • 请列举 Nginx 服务器的最佳用途。
    • 请解释 Nginx 服务器上的 Master 和 Worker 进程分别是什么?
    • 请解释你如何通过不同于 80 的端口开启 Nginx?
    • 请解释是否有可能将 Nginx 的错误替换为 502 错误、503?
    • 在 Nginx 中,解释如何在 URL 中保留双斜线?
    • 请解释 ngx_http_upstream_module 的作用是什么?
    • 请解释什么是 C10K 问题?
    • 请陈述 stub_status 和 sub_filter 指令的作用是什么?
    • 解释 Nginx 是否支持将请求压缩到上游?
    • 解释如何在 Nginx 中获得当前的时间?
    • 用 Nginx 服务器解释-s 的目的是什么?
    • 解释如何在 Nginx 服务器上添加模块?

    Nginx 面试题答案:

    阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂

    (2)Nginx(精通Nginx)

    • 第1章 安装Nginx及第三方模块
    • 第2章 配置指南
    • 第3章 使用mail模块
    • 第4章 Nginx作为反向代理
    • 第5章 反向代理高级话题
    • 第6章 Nginx HTTP服务器
    • 第7章 Nginx的开发
    • 第8章 在Nginx中集成Lua
    • 第9章 故障排除技巧

    阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂

    四、Docker 相关

    (1)Docker 面试专题

    1. 介绍一下docker的优点有哪些?
    2. Docker的组成结构是怎么样的呢?
    3. Docker有哪些具体的应用场景呢?

    (2)Docker 学习笔记(Xmind)

    阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂

    (3)Docker 实战系列(Docker技术入门与实战)

    阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂

    第一部分 Docker入门

    • Docker
    • Docker的核心概念和安装
    • 镜像
    • 容器
    • 仓库
    • 数据管理
    • 网络基础配置
    • 使用Dockerfile创建镜像

    第二部分 实战案例

    • 操作系统
    • 创建支持SSH服务的镜像
    • Web服务器与应用
    • 数据库应用
    • 编程语言
    • 使用私有仓库
    • 构建Docker容器集群
    • 在公有云上使用Docker
    • Docker实践之道

    第三部分 高级话题

    • Docker安全
    • 高级网络配置
    • Docker相关项目

    面试准备+复习资料分享:

    为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦,有需要的可以来找我获取哈

    获取方式:点击蓝色字体即可免费获取

    秋招|美团java一面二面HR面面经,分享攒攒人品

    付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦,有需要的可以来找我获取哈

    获取方式:点击蓝色字体即可免费获取

    [外链图片转存中…(img-mnymapDd-1625940838740)]

    展开全文
  • 文件为压缩包,包括多个java识别图片文字的项目,国内网站上资料比较少,项目都整理出了测试类及说明,都包含着源代码及jar包、安装包、训练库。希望用得到的人少走弯路,资源都精心整理测试过,高分是必须的。 java...
  • java验证码识别 JAVA知识巩固 源码 java验证码识别 java验证码识别
  • JAVA识别验证码,支持变形,扭曲,斜线,噪点,支持自己训练
  • Java识别验证码和图像处理

    万次阅读 多人点赞 2018-06-07 12:07:47
    阅读本文可能会解决的问题:① Java识别验证码② Tess4J的使用和OCR识别③ JavaCV的使用二值化和灰度测试④ Java裁剪和缩放图片⑤ 如何生成数字&字母验证码⑥ ...这里老样子先说几句无关的话,去年毕业的...

    阅读本文可能会解决的问题:

    ① Java识别验证码
    ② Tess4J的使用和OCR识别
    ③ JavaCV的使用二值化和灰度测试
    ④ Java裁剪和缩放图片
    ⑤ 如何生成数字&字母验证码
    ⑥ ...

    这里老样子先说几句无关的话,去年毕业的时候帮同学做了一个验证码识别系统,按部就班的参考了大神的操作,对于二值化这些操作都没有深入了解,最近做项目遇到了要实现机器登录的操作,验证码自然绕不过去所以就又翻出来参考总结一下,方便自己也分享给大家。同时我也发现现在除了一些政府网站外,基本很少有采用下面我列出的这种数字&字母验证码了,所以针对项目需求做的这个识别可能目前并没有什么参考价值,但是在学习的过程中也了解了很多比如Tess4J和JavaCV这些技术,图像处理比如缩放和裁剪等,话不多说,下面就搞起吧。

    一、常见的验证码识别

    1.常见验证码

         

    这里我主要针对第四种验证码进行识别,其实试验后我发现前面三个都是可以识别的,只是裁剪和二值化的阈值需要调整。

    2.识别思路

    输入原始验证码之后,先对图片进行干扰像素去除,再裁剪边角,最后利用Tess4J进行识别。

    3.主要代码

    main方法调用具体实现方法

        public static void main(String[] args){
    
            //原始验证码地址
            String OriginalImg = "C:\\mysoftware\\images\\upload\\OcrImg\\oi.jpg";
            //识别样本输出地址
            String ocrResult = "C:\\mysoftware\\images\\upload\\OcrResult\\or.jpg";
            //去噪点
            ImgUtils.removeBackground(OriginalImg, ocrResult);
            //裁剪边角
            ImgUtils.cuttingImg(ocrResult);
            //OCR识别
            String code = Tess4J.executeTess4J(ocrResult);
            //输出识别结果
            System.out.println("Ocr识别结果: \n" + code);
    
        }
    其中removeBackground方法去除验证码噪点,首先我定义了一个临界阈值,这个值代表像素点的亮度,我们在实际扫描验证码的每一个像素块时通过判断该像素块的亮度(获取该像素块的三原色)是否超过该自定义值,从而判断出是否删除或保留该像素块,因此针对不同的验证码我们可以调整这个阈值,比如像我上面列出的几种验证码波动一般都在100~600之间,通过测试就得出一个比较适中的阈值可以大大提高验证码的提纯度。
    public static void removeBackground(String imgUrl, String resUrl){
            //定义一个临界阈值
            int threshold = 300;
            try{
                BufferedImage img = ImageIO.read(new File(imgUrl));
                int width = img.getWidth();
                int height = img.getHeight();
                for(int i = 1;i < width;i++){
                    for (int x = 0; x < width; x++){
                        for (int y = 0; y < height; y++){
                            Color color = new Color(img.getRGB(x, y));
                            System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue());
                            int num = color.getRed()+color.getGreen()+color.getBlue();
                            if(num >= threshold){
                                img.setRGB(x, y, Color.WHITE.getRGB());
                            }
                        }
                    }
                }
                for(int i = 1;i<width;i++){
                    Color color1 = new Color(img.getRGB(i, 1));
                    int num1 = color1.getRed()+color1.getGreen()+color1.getBlue();
                    for (int x = 0; x < width; x++)
                    {
                        for (int y = 0; y < height; y++)
                        {
                            Color color = new Color(img.getRGB(x, y));
    
                            int num = color.getRed()+color.getGreen()+color.getBlue();
                            if(num==num1){
                                img.setRGB(x, y, Color.BLACK.getRGB());
                            }else{
                                img.setRGB(x, y, Color.WHITE.getRGB());
                            }
                        }
                    }
                }
                File file = new File(resUrl);
                if (!file.exists())
                {
                    File dir = file.getParentFile();
                    if (!dir.exists())
                    {
                        dir.mkdirs();
                    }
                    try
                    {
                        file.createNewFile();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
                ImageIO.write(img, "jpg", file);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    

    这样就能得到一个降噪之后的验证码,再后续通过颜色反转将验证码的内容显示出来就完成了干扰像素的去除工作,接下来非必要的一项工作就是将验证码进行裁边。为什么要裁边呢,通过观察我们发现验证码的边角部分没有干扰素涂抹,在我们的去除干扰素过程中可能会影响到这部分像素块导致最后边角有噪点,这时将边角裁掉几个像素就可以了。

    public static void cuttingImg(String imgUrl){
            try{
                File newfile=new File(imgUrl);
                BufferedImage bufferedimage=ImageIO.read(newfile);
                int width = bufferedimage.getWidth();
                int height = bufferedimage.getHeight();
                if (width > 52) {
                    bufferedimage=ImgUtils.cropImage(bufferedimage,(int) ((width - 52) / 2),0,(int) (width - (width-52) / 2),(int) (height));
                    if (height > 16) {
                        bufferedimage=ImgUtils.cropImage(bufferedimage,0,(int) ((height - 16) / 2),52,(int) (height - (height - 16) / 2));
                    }
                }else{
                    if (height > 16) {
                        bufferedimage=ImgUtils.cropImage(bufferedimage,0,(int) ((height - 16) / 2),(int) (width),(int) (height - (height - 16) / 2));
                    }
                }
                ImageIO.write(bufferedimage, "jpg", new File(imgUrl));
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    其中裁剪图片我们需要预先读取宽高度,确认需要裁剪的像素宽度,我这里将60*20的图像宽度两边各裁剪4像素,高度上下各裁剪2像素,输出就得到了一个清晰的图像。到这里基本完成了对验证码的简单处理,不出意外的话验证码由

      变为了 

    到这里就很简单了,我们可以利用裁切将图片平均剪成四份,再通过简单的训练比对完成匹配,详细操作可以看这里,我就不再赘述了。我这里提供另一个思路,就是要说的Tess4J文本识别工具,通过这个工具我可以直接对当前生成的验证码进行OCR识别,准确率接近100%,注意我项目里是采用Tess4J进行最终的验证码图片内容识别的。

    二、Tess4J的使用

    1.首先需要到官网下载Tess4J的压缩包,下载后先将解压出来的包内tessdata文件拷入项目根目录,然后引入Tess4J\lib包,最后还要单独引入Tess4J\dist\tess4j-3.4.8.jar包

    2.编写简单的识别代码

    public static String executeTess4J(String imgUrl){
            String ocrResult = "";
            try{
                ITesseract instance = new Tesseract();
                //instance.setLanguage("chi_sim");
                File imgDir = new File(imgUrl);
                //long startTime = System.currentTimeMillis();
                ocrResult = instance.doOCR(imgDir);
            }catch (TesseractException e){
                e.printStackTrace();
            }
            return ocrResult;
        }

    ocrResult 即为最终是别的结果,代码相当简单,其中我注释掉的 instance.setLanguage("chi_sim"); 这部分是指定需要识别文本的语言,如果是识别中文按照我注释的chi_sim填写即可,当然这是一个中文包,需要先在这里找到中文包下载后放到Tess4J\tessdata目录下即可使用。

    到这里基本就完成了对这个验证码的简单识别,在这个过程中基本没遇到什么有难度的工作,毕竟是站在大佬们的肩膀上操作,其实还是学到了很多东西的,需求这东西说不定哪天就遇到了呢。接下来我在研究验证码识别的过程中了解到了JavaCV,比较感兴趣就记录下来,方便之后使用吧。

    三、JavaCV的使用

    1. 首先就是去官网下载包啦,点 这里,引入很简单,解压后将javacv-bin包引入项目即可(可以看到封装了OpenCV)

    2. 基本操作:获取灰度图像、获取二值化处理图像

    public static void main(String[] args) {
            //图片地址
            String imgUrl = "C:\\mysoftware\\images\\upload\\OcrImg\\20180607004153.png";
            //得到灰度图像
            getHuidu(imgUrl);
            //得到二值化处理图像
            getErzhihua(imgUrl);
        }
    
        //得到灰度图像
        public static void getHuidu(String imgUrl){
            Mat image=imread(imgUrl,CV_LOAD_IMAGE_GRAYSCALE);
            //读入一个图像文件并转换为灰度图像(由无符号字节构成)
            Mat image1=imread(imgUrl,CV_LOAD_IMAGE_COLOR);
            //读取图像,并转换为三通道彩色图像,这里创建的图像中每个像素有3字节
            //如果输入图像为灰度图像,这三个通道的值就是相同的
            System.out.println("image has "+image1.channels()+" channel(s)");
            //channels方法可用来检查图像的通道数
            flip(image,image,1);//就地处理,参数1表示输入图像,参数2表示输出图像
            //在一窗口显示结果
            namedWindow("输入图片显示窗口");//定义窗口
            imshow("输入图片显示窗口",image);//显示窗口
            waitKey(0);//因为他是控制台窗口,会在mian函数结束时关闭;0表示永远的等待按键,正数表示等待指定的毫秒数
        }
    
        //得到二值化处理图像
        public static void getErzhihua(String imgUrl){
            // TODO Auto-generated method stub
            Mat image=imread(imgUrl);	//加载图像
            if(image.empty())
            {
                System.out.println("图像加载错误,请检查图片路径!");
                return ;
            }
            imshow("原始图像",image);
            Mat gray=new Mat();
            cvtColor(image,gray,COLOR_RGB2GRAY);		//彩色图像转为灰度图像
            imshow("灰度图像",gray);
            Mat bin=new Mat();
            threshold(gray,bin,120,255,THRESH_TOZERO); 	//图像二值化
            imshow("二值图像",bin);
            waitKey(0);
        }

    看一下效果:

    四、生成验证码

    生成验证码大致思路:
    加载登录界面时向后台请求一个随机验证码code存入session,并在页面以图形显示出来,用户输入登录信息后点击登录,后台读出session的验证码code比对是否一致,不一致返回错误信息,一致则进行登录账号密码校验。
    1. 首先在login的页面添加一个img
    <div class="form-group">
                       <label class="col-sm-2 control-label">验证</label>
                       <div class="col-sm-10">
                           <input id = "code" type="text" name="vcode" value="请输入验证码" maxlength="4" tabindex="3" style="width:123px;padding: 6px 12px;border: 1px solid #ccc;font-size: 14px;line-height: 1.42857143;color: #555;background-color: #fff;border-radius: 4px;box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;" οnfοcus="if(this.value=='请输入验证码'){this.value='';}"  οnblur="if(this.value==''){this.value='请输入验证码';}"/>
                           <a href="#" id="js-get_mobile_vcode" class="button btn-disabled">
                               <img src="../recordHome/getRand" id="randImg"  οnclick="changeValidateCode(this)"/>
                           </a>
                       </div>
                   </div>
    其中为了方便用户使用,需要做点击图片自动获取新的验证码,所以changeValidateCode()方法是动态去后台请求验证码并设置到页面上
    function changeValidateCode() {
        var timestamp = new Date().getTime();
        $("#randImg").attr('src','../recordHome/getRand?flag='+timestamp);
    }
    请求时添加时间戳是为了防止浏览器缓存导致获取失败
    2. 后台生成验证码
    /**
    	 * 随机生成4位验证码
    	 * @param httpSession
    	 * @param request
    	 * @param response
    	 */
    	@RequestMapping(value="/getRand")
    	public void rand(HttpSession httpSession, HttpServletRequest request, HttpServletResponse response){
    		// 在内存中创建图象
    		int width = 65, height = 20;
    		BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
    		// 获取图形上下文
    		Graphics g = image.getGraphics();
    		// 生成随机类
    		Random random = new Random();
    		// 设定背景色
    		g.setColor(getRandColor(200, 250));
    		g.fillRect(0, 0, width, height);
    		// 设定字体
    		g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
    		// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    		g.setColor(getRandColor(160, 200));
    		for (int i = 0; i < 155; i++) {
    			int x = random.nextInt(width);
    			int y = random.nextInt(height);
    			int xl = random.nextInt(12);
    			int yl = random.nextInt(12);
    			g.drawLine(x, y, x + xl, y + yl);
    		}
    		// 取随机产生的认证码(6位数字)
    		String sRand = "";
    		for (int i = 0; i < 4; i++) {
    			String rand = String.valueOf(random.nextInt(10));
    			sRand += rand;
    			// 将认证码显示到图象中
    			g.setColor(new Color(20 + random.nextInt(110), 20 + random
    					.nextInt(110), 20 + random.nextInt(110)));
    			// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    			g.drawString(rand, 13 * i + 6, 16);
    		}
    		// 将认证码存入SESSION
    		ContextHolderUtils.getSession().setAttribute("rand", sRand);
    		//httpSession.setAttribute("rand", sRand);
    		// 图象生效
    		g.dispose();
    		try{
    			ImageIO.write(image, "JPEG", response.getOutputStream());
    			response.getOutputStream().flush();
    		}catch (Exception e){
    		}
    	}
    
    	/**
    	 * 给定范围获得随机颜色
    	 * @param fc
    	 * @param bc
    	 * @return
    	 */
    	private Color getRandColor(int fc, int bc) {
    		Random random = new Random();
    		if (fc > 255)
    			fc = 255;
    		if (bc > 255)
    			bc = 255;
    		int r = fc + random.nextInt(bc - fc);
    		int g = fc + random.nextInt(bc - fc);
    		int b = fc + random.nextInt(bc - fc);
    		return new Color(r, g, b);
    	}
    使用ContextHolderUtils.getSession().setAttribute("rand", sRand);将验证码存入session中
    @RequestMapping("/login")
    	public String login(HttpServletRequest request, HttpServletResponse response, @RequestParam String username, @RequestParam String password, @RequestParam String vcode) {
    		if(!vcode.equals(ContextHolderUtils.getSession().getAttribute("rand"))){
    			request.setAttribute("failMsg", "验证码不正确!");
    			return "/base/login";
    		}
    		logger.info("用户登录用户:" + username );
    		...
    	}
    登录时进行校验,就酱so easy


    最后是全部代码,这里说到的我都集成到了项目里,直接下载就可以运行,欢迎大家指正。

    有用的话可以☆star一下哦

    https://github.com/jwwam/OcrImage.git


    本文完 2018-6-7

    有问题欢迎大家留言指正大笑

    来自 https://blog.csdn.net/zhulier1124/article/details/80606647

    转载请注明,谢谢。

    展开全文
  • 图片验证码识别,简单写下,做个备忘。   一、注册百度账号及新增一个应用,获取百度API所需的AppID,API Key,Secret Key三个参数。 访问http://ai.baidu.com,使用百度账号登录后,出现如下界面 成功创建...
  • Java 爬虫之识别图片验证码后登录

    千次阅读 热门讨论 2020-01-10 15:07:22
    这几年Python爬虫特别的火,我有个朋友是一个Python爬虫工程师,本人菜鸡Java开发工程师一名,最近所做的一个项目是需要去爬一个网页的数据,但是进入网页需要登录,登录需要输入图片验证码。爬虫的第三方jar包用的...
  • 使用机器学习端到端图片验证码识别,通杀所有图片类型验证码类型(包括复杂的连在一起、重叠的验证码),支持...机器学习识别验证码,提供了一个完整的图片验证码识别教程 不懂的可以联系我:xxguo81527@foxmail.com
  • 资源包括Java代码以及引用包、tesseract安装包和使用说明
  • jmeter通过调用OCR识别图片验证码,但是识别率不高,有需要的可以试一试能否识别 参考文章http://sanwen.net/a/rmskmpo.html
  • java图片滑动验证码

    2020-04-28 00:36:33
    java图片滑动验证码,原作者给得代码不完整,我发一个完整的代码,不谢!原文链接:https://download.csdn.net/download/shiqiangwen/11164170
  • 通过OpenCV实现的全自动图形图片验证码识别软件,可以识别出绝大多数验证码,操作简单方便。
  • 主要介绍了Java实现验证码具体代码,包括图片验证码、汉字验证码,感兴趣的小伙伴们可以参考一下
  • java验证码识别

    千次下载 热门讨论 2011-11-22 22:06:01
    java 验证码识别 ocr java 验证码识别 ocr
  • java识别验证码 仅限字母数字 附带bmp图片 验证码图片位置随机变动
  • java 利用Tesseract-OCR识别图片验证码

    万次阅读 2017-01-05 11:51:04
    1.windows下的Tesseract-OCR安装Tesseract-OCR下载: http://pan.baidu.com/s/1miRU6EG 识别语言库: 官网地址: https://github.com/tesseract-ocr/langdata 或者网盘: http://pan.baidu.com/s/1kV18iov 安装...
  • JAVA识别复杂验证码+图像处理

    千次阅读 2018-12-13 17:42:45
    先对验证码进行简单的处理噪点和纯色 例未曾处理的图片 public static void main(String[] args) throws Exception { //源文件 String picName = "C:\\Users\\syxy101\\Desktop\\6.jpg"; File file...
  • 1,目前简单的验证码识别可以使用tess4J进行图像识别,前提是需要将验证码图片处理好(清晰,黑白色,无其他干扰素,字体大小一样,间距合适),这样才能保证识别正确 2,简单验证码图片处理方法,二值化,去干扰线...
  • NULL 博文链接:https://lvhuiqing.iteye.com/blog/1474186
  • 使用java来做验证码识别识别一些普通的验证码图片 前言: 我们都知道,验证码的作用是用来验证你是否为机器人,基本是做反爬虫或刷数据的一类功能验证。针对这种情况,引用一位老人家的名言,“要用魔法打败魔法”...
  • 在本篇文章里小编给大家分享的是关于Java 如何使用 OCR 技术识别验证码实现自动化登陆的相关知识点内容,需要的朋友们学习下。
  • java技术解析验证码时会用的jar包
  • JAVA智能验证码识别,可训练提高识别率,带干扰线的也可以识别到,绝对可用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,512
精华内容 4,604
关键字:

java识别图片验证码

java 订阅