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

 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学习笔记【六、正则表达式】

    参考:http://www.runoob.com/java/java-regular-expressions.html 概述 java.util.regex包,主要包含三个类: Pattern:正则表 ...

  2. 【1】Zookeeper概述

    一.前言 在"网络是不可靠的"这一前提下,分布式系统开发需要解决如下四个问题: 客户端如何访问众多服务?  解决方案:服务聚合,使用API网关 服务于服务之间如何通信?  解决方案 ...

  3. 在已有lnmp环境的基础上安装PHP7

    Centos7.6系统 已经安装lnmp一键环境 想装个apache跑php7, apache安装在这 https://www.cnblogs.com/lz0925/p/11227063.html 要 ...

  4. ubuntu版本信息查看

    1.cat /etc/issue 2.cat /etc/lsb-release 3.uname -a 4.cat /proc/version 5.lsb_release -a 显卡信息1.lspci ...

  5. 如何使用ProcessOn制作思维导图

    新建一张思维导图之后你是不是有点茫然? 不是因为脑海里没思路,而是不知道怎么把脑海里的思路呈现出来?看到一个孤零零的中心主题和看起来有些简单的页面一时间有点无所适从? 很多人觉得思维导图好看但学起来难 ...

  6. 基于docker安装pxc集群

    基于docker安装pxc集群 一.PXC 集群的安装 PXC集群比较特殊,需要安装在 linux 或 Docker 之上.这里使用 Docker进行安装! Docker的镜像仓库中包含了 PXC数据 ...

  7. Jquery实现类似百度的搜索框

    最近工作中需要做一个搜索框,类似百度的搜索框,需要达到两个功能: 1.输入关键字,展示匹配的下拉列表 2.选择匹配的项后查出相关内容 一般电商网站中也经常用到该搜索条,首先分析功能实现,输入关键字马上 ...

  8. Python 编解码

    字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在python中,使用unicode类型作为编码的基础 ...

  9. 1.opencv_画图

    #导入工具包 import numpy as np import cv2 import matplotlib.pyplot as plt # 定义显示图片 def show(image): plt.i ...

  10. crc32 cpp Makefile可参考

    https://github.com/stbrumme/crc32 # simple Makefile CPP = g++ # files PROGRAM = Crc32Test LIBS = -lr ...