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

 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. Java反射【二、Class类的使用】

    类本身也是对象,是java.lang.Class类的实例对象--There is a class named Class. Class类表示方式 Class类只有Java虚拟机才能初始化,有三种表示方 ...

  2. 公司 vuessr 项目讲解

  3. NETGEAR 系列路由器命令执行漏洞简析

    NETGEAR 系列路由器命令执行漏洞简析 2016年12月7日,国外网站exploit-db上爆出一个关于NETGEAR R7000路由器的命令注入漏洞.一时间,各路人马开始忙碌起来.厂商忙于声明和 ...

  4. python中_、__、__xx__(单下划线、双下划线等)的含义

    (1)_xxx "单下划线 " 开始的成员变量相当于私有变量,也叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问(可以定义有点像java中的ge ...

  5. java线程基础巩固---同步代码块以及同步方法之间的区别和关系

    在上一次中[http://www.cnblogs.com/webor2006/p/8040369.html]采用同步代码块的方式来实现对线程的同步,如下: 对于同步方法我想都知道,就是将同步关键字声明 ...

  6. shell进阶--流程

    由于条件判断和循环跟其他语言都大同小异,学过编程的话很好理解,这里只贴出格式,不具体写用法了.(select菜单会详细讲一下) 条件判断 if条件判断 普通if条件判断: 嵌套if条件判断: 循环 f ...

  7. ios 打包 异常

    1. 问题:Xcode9升级到Xcode10后运行App报错: 2. 原因分析: Xcode10中libstdc++.6.0.9和libstdc++被移除,Frameworks中libstdc++.6 ...

  8. JS自带的map()方法

    1. map()方法返回一个由原数组的每个元素调用一个指定方法后返回值组成的新数组. 2. 例子: 2.1 在字符串中使用map 在一个String上使用map方法获取字符串中每个字符所对应的ASCI ...

  9. 10-SQLServer中统计信息的使用

    一.总结 1.网址https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-stats-tr ...

  10. Gradle 配置国内镜像

    项目级配置 在项目中找到如下文件 打开,添加上阿里云镜像 maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}