package com.xxx;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.junit.Test;

public class IdentifyingCode {
    
    private final int WIDTH = 70;
    private final int HEIGHT = 30;
    private final byte[] BACKGROUND_COLOR = new byte[]{127, 127, 127};
    private final String FONT_STYLE = "微软雅黑";
    private final char[] IDETIFYING_CODE = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd'};
    private final int CODE_LENGTH= 4;
    private final int FONT_SIZE = 17;
    
    //生成验证码图
    public BufferedImage createIdentifyingCode(){
        StringBuilder sb = new StringBuilder();
        
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
        //得到画笔
        Graphics2D g =  image.createGraphics();
        //得到之前画笔的颜色
        Color color = g.getColor();
        
        //画图片边框
        this.drawImageCheek(g);
        this.drawCamouflageLine(g, 8);
        //设置背景色
        g.setBackground(new Color(BACKGROUND_COLOR[0]+128, BACKGROUND_COLOR[1]+128, BACKGROUND_COLOR[2]+128));
        //设置字体大小及其样式
        g.setFont(new Font(FONT_STYLE, Font.PLAIN, (int)(this.FONT_SIZE)){
            private static final long serialVersionUID = 1L;});
        
        //将验证字符加入图中
        for(int i=0; i<CODE_LENGTH; i++){
            //设置画笔颜色
            g.setColor(this.randomColor());
            //得到随机字符
            char charCode = IDETIFYING_CODE[this.randomNumber(0, IDETIFYING_CODE.length-1)];
            sb.append(charCode);
            //将字符写到图片中
            System.out.println(sb);
            //g.rotate(this.randomNumber(45, 135));
            g.drawString(""+charCode, WIDTH/5*(i+1)-5, (this.FONT_SIZE)+this.randomNumber(0, this.FONT_SIZE/2));
            
        }
        
        try {
            ImageIO.write(image, "jpeg", new FileOutputStream("D:/11.jpeg"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return image;
    }
    
    /**
     * 按照随机三原色生成一个颜色
     *
     * @return 颜色
     */
    public Color randomColor(){
        int min = 0;
        int max = 255;
        int red = randomNumber(min, max);
        int green = randomNumber(min, max);
        int yellow = randomNumber(min, max);
        return new Color(red, green, yellow);
    }
    
    public void drawCamouflageLine(Graphics2D g, int quantity){
        Color oldColor = g.getColor();
        for(int i=0; i<quantity; i++){
            g.setColor(this.randomColor());
            g.drawLine(this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT), this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT));
        }
        g.setColor(oldColor);
    }
    
    /**
     * 绘制图片内侧边框
     *
     * @param g 画笔
     */
    public void drawImageCheek(Graphics2D g){
        Color oldColor = g.getColor();
        g.setColor(new Color(255, 255, 255));
        g.drawLine(0, 0, this.WIDTH-2, 0);
        g.drawLine(0, 0, 0, this.HEIGHT-2);
        g.drawLine(0, this.HEIGHT-2, this.WIDTH-2, this.HEIGHT-2);
        g.drawLine(this.WIDTH-2, 0, this.WIDTH-2, this.HEIGHT-2);
        g.setColor(oldColor);
    }
    
    public int randomNumber(int min, int max){
        return (int)((Math.random()*(max-min+1))+min);
        
    }
    
    public static void main(String[] args) {
        new IdentifyingCode().createIdentifyingCode();
    }
}

其中待解决的问题:背景没有设置正确

待优化:验证图中的验证码需要旋转增加程序识别难度

这是目前的效果

java实现简单的验证码(待增强)的更多相关文章

  1. java识别简单的验证码

    1.老规矩,先上图 要破解类似这样的验证码: 拆分后结果: 然后去匹配,得到结果. 2.拆分图片 拿到图片后,首先把图片中我们需要的部分截取出来. 具体的做法是,创建一个的和图片像素相同的一个代表权重 ...

  2. java生成简单验证码图片

    概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...

  3. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

  4. 用java实现邮件发送验证码

    java实现邮件发送验证码 建议不要用qq邮箱,我使用qq邮箱直接一直给我报530错误,我一直认为我代码写的有错误或者POP3/SMTP服务没弄好.所以建议注册个别的邮箱,我就申请了个网易163邮箱瞬 ...

  5. java关于集合的遍历与增强for循环(foreach)的使用

     java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合.      许多情况需要我们遍历出集合 ...

  6. Java案例之随机验证码功能实现

    实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的 ...

  7. Java使用Java OCR API进行验证码识别

    Maven坐标: <!-- https://mvnrepository.com/artifact/com.asprise.ocr/java-ocr-api --> <dependen ...

  8. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

  9. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

随机推荐

  1. Oracle数据库体系结构及创建表结构

    Oracle服务器主要由实例.数据库.程序全局区和前台进程组成,其中实例就是用来提供管理数据库的功能:数据库由数据库文件组成,用来存储系统数据:实例可以进一步划分为系统全局区(SGA)和后台进程(PM ...

  2. ssh那些事儿

    第一次使用ssh是上学期搭建hadoop集群的时候,当时照着各种配置文档费了九牛二虎之力终于把环境搭建成功,现在想想当时还真是不容易呢.好了废话不扯了,进入正题. 计算机发展早期能实现两台机器之间的通 ...

  3. 慕课网-Java入门第一季-6-10 练习题

    来源:http://www.imooc.com/ceping/1596 以下关于二维数组的定义和访问正确的是() A int[ ][ ] num = new int[ ][ ]; B int[ ][ ...

  4. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  5. C#小程序飞行棋地图绘制

    1. 初始化地图,在绘制时可先将地图进行初始化,用数组来存储关卡的位置,然后利用循环给地图中 关卡所在处赋予代表关卡的值. 关键代码如下 /// <summary> /// 初始化游戏地图 ...

  6. java反射,ReflectUtils

    public class ReflectUtils { /** * 通过构造函数实例化对象 * @param className 类的全路径名称 * @param parameterTypes 参数类 ...

  7. 在C#中如何将多个rtf文件内容组合在一起用一个rtf文件保存?

    //重点为是使用 SelectedRtf 属性 private void button1_Click( object sender, EventArgs e ) { //mergeRTF为并内容后的 ...

  8. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  9. 前端菜鸟的编程之路之css的用法

    /* * * 固定特殊类 * */ /* ===========固定宽度*============= */ .ld-with80{width: 80px} .ld-with50{width: 50px ...

  10. MongoDB可视化工具RoboMongo----Windows安装 1

    https://robomongo.org/download 非常小白的安装 自动安装完成. 启动MongoDB Mongodb启动教程 启动RoMongo 创建新的Mongodb 自定义db名称 连 ...