最近看了网上很多大佬们写的验证码生成,寻思着自己也写一个,话不多说,代码如下:

 import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random; import javax.imageio.ImageIO; public class VerifyCode {
private int width = 90;
private int high = 40;
private Random random = new Random();
private String[] fonts = {"宋体", "微软雅黑", "TimesRoman", "Cambria"};
private String chars = "1234567890";
private String operator = "+-x";
private Color backColor = Color.white;
private String text;
private int no1;
private int no2;
private String op; //获取随机颜色
private Color randomColor()
{
int red = random.nextInt(150);
int green = random.nextInt(150);
int blue =random.nextInt(150);
return new Color(red,green,blue);
} //method:获取随机字体
private Font randomFont()
{
int index = random.nextInt(fonts.length);
String fontName = fonts[index];
int style = random.nextInt(4);
int size = 24+random.nextInt(4); return new Font(fontName,style,size);
}
//method:获取随机操作符号
private String randomOperator()
{
int index = random.nextInt(3);
return operator.charAt(2)+"";
} //method:获取随机数字
private String randomNum()
{
int index = random.nextInt(chars.length());
return chars.charAt(index)+"";
} //method:添加干扰线
private void drawLine(BufferedImage image)
{
int num = 3;
Graphics2D graphic = (Graphics2D)image.getGraphics();
for(int i=0;i<num;i++)
{
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(high);
int y2 = random.nextInt(high);
graphic.setColor(this.randomColor());
graphic.setStroke(new BasicStroke(1.5F));
graphic.drawLine(x1,y1,x2,y2);
}
}
//method:绘制方法
private void drawString(Graphics2D graphics,String s,float position)
{
graphics.setColor(randomColor());
graphics.setFont(randomFont());
graphics.drawString(s,position,high -5);
} //获取图片缓存
public BufferedImage getImage()
{
BufferedImage bi = new BufferedImage(width,high,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)bi.getGraphics();
g2.setColor(this.backColor);
g2.fillRect(0, 0, 90, 40);
StringBuilder sb = new StringBuilder(); //获取操作数s1,绘制
String s1 = randomNum();
this.no1 = Integer.parseInt(s1);
float p1 = 5.0F;
sb.append(s1);
drawString(g2,s1,p1); //获取操作符oper,绘制
String oper = randomOperator().trim();
this.op = oper;
sb.append(oper);
float p2 = 1.0F*width/5;
drawString(g2,oper,p2); //获取操作数s2,绘制
String s2 = randomNum();
this.no2 = Integer.parseInt(s2);
float p3 = 2.0F*width/5;
sb.append(s2);
drawString(g2,s2,p3); //绘制 等号和问号
String calculate = "=?";
float p4 = 3.0F*width/5;
drawString(g2,calculate,p4); //绘制干扰线
drawLine(bi); //返回BufferedImage图片
return bi;
} //获取算术的运算结果
public int getValue()
{
int value = 0;
switch(this.op)
{
case "+": value = this.no1+this.no2;break;
case "-": value = this.no1-this.no2;break;
case "x":value = this.no1*this.no2;break;
default :value = 0;
}
return value;
} //将图片缓存bi输出到指定的输出流out
public static void output(BufferedImage bi, OutputStream out)
throws FileNotFoundException, IOException
{
ImageIO.write(bi,"JPEG",out);
}
}

测试代码如下:

    @Test
public void test1()
{
VerifyCode verifyCode = new VerifyCode();
BufferedImage bi = verifyCode.getImage(); FileOutputStream out;
try
{
out = new FileOutputStream("H:\\verifyCode.jpg");
VerifyCode.output(bi, out);
}catch (Exception e)
{
e.printStackTrace();
}
System.out.println(verifyCode.getValue());
}

生成的验证码图片如下:

  

程序输出结果如下:

18

以上,只实现了10以内的加减乘,除法都没有,毕竟作为验证码,除法还要考虑除数非0、整除等内容,因此未添加除法。各位看看就好,水平有限,请多多指教!

java实现一个简单的验证码生成器的更多相关文章

  1. Java 创建一个简单的验证码图片

    代码如下: package lixin.gan.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  4. 使用 java 实现一个简单的 markdown 语法解析器

    1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...

  5. java:jsp: 一个简单的自定义标签 tld

    java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...

  6. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  7. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

  8. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

  9. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

随机推荐

  1. Nginx作为静态资源web服务之跨域访问

    Nginx作为静态资源web服务之跨域访问 首先了解一下什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相 ...

  2. vue-cli3.x创建项目vue create hello-world

    在git中输入指令vue create hello-world,没反应,因为vue-cli的版本问题,必须3.x版本才能使用这个指令于是按照官网的提示升级vue vue-cli从2.x版本升级到3.x ...

  3. ssh登录缓慢,使用ssh -v登录后,显示在 “pledge: network” 处卡顿:

    当登录一台服务器时,每次输入密码之后都要等很久才会得到命令提示符,尝试修改了sshd_config中的UseDNS no,但效果依然不好. ssh -v 192.168.12.43 This is p ...

  4. MySQL数据库笔记五:多表查询

    1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表 create table man( mid int primary key auto_increment, mn ...

  5. (转)I2C 上拉大小

    中断,GPIO,I2C等一般都是OC或者OD门,芯片内部无上拉电阻时,则外部必须加上拉电阻才能输出高电平.一般I/O端的驱动能力在2-4mA量级,OC或者OD门的导通电压为0.4V左右,手机中加在上拉 ...

  6. IntelliJ IDEA和Eclipse快捷键对比总结

  7. CSS基础学习-4.CSS属性_背景、颜色、边框

  8. [转载]Spark-Task not serializable错误解析

    Spark-Task not serializable错误解析 2018年05月17日 15:33:03 沙拉控 阅读数:1509   在学习SparkStreaming的时候偶然出现的一个问题,先看 ...

  9. 今日理解之js

    JavaScript 是前端的一门编程语言(也是有逻辑) node.js 支持前端js代码 跑在后端服务器上 Js跟Java什么关系? Js跟Java半毛钱关系都没有!!! 原因是当初Java特别火 ...

  10. Machine Learning(Andrew Ng)学习笔记

    1.监督学习(supervised learning)&非监督学习(unsupervised learning) 监督学习:处理具有若干属性且返回值不同的对象.分为回归型和分类型:回归型的返回 ...