importjavax.imageio.ImageIO;import java.awt.*;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.io.OutputStream;importjava.util.Random;public classCaptchaUtils {private final static Object lock = newObject();/*** 图片的宽度。*/

private int width = 132;/*** 图片的高度。*/

private int height = 40;/*** 验证码字符个数*/

private int codeCount = 4;/*** 验证码干扰线数*/

private int lineCount = 10;private staticCaptchaUtils instance;static{synchronized(lock) {if (instance == null) {

instance= newCaptchaUtils();

}

}

}public staticCaptchaUtils getInstance() {returninstance;

}private static final char[] codeSequence ={'A', 'B', 'C', 'D', 'E', 'F', 'G','H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T','U', 'V', 'W', 'X', 'Y', 'Z','1', '2', '3', '4', '5', '6', '7', '8', '9'};publicString createCode() {

Random random= newRandom(System.currentTimeMillis());

StringBuffer buffer= newStringBuffer();for (int i = 0; i < codeCount; i++) {

String strRand=String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);

buffer.append(strRand);

}returnbuffer.toString().toLowerCase();

}public voiddraw(String code, OutputStream sos) {

BufferedImage bufferedImage= this.drawCode(code);try{

ImageIO.write(bufferedImage,"png", sos);

sos.close();

}catch(IOException e) {

e.printStackTrace();

}

}privateBufferedImage drawCode(String code) {int x = 0, fontHeight = 0, codeY = 0;int red = 0, green = 0, blue = 0;//生成随机数

Random random = newRandom(System.currentTimeMillis());//每个字符的宽度

x = width /codeCount;//字体的高度

fontHeight = height - 8;

codeY=height;//图像buffer

BufferedImage buffImg = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D g=buffImg.createGraphics();//将图像填充为白色

g.setColor(Color.WHITE);

g.fillRect(0, 0, width, height);

Font font= new Font("Arial", Font.PLAIN, fontHeight);

g.setFont(font);for (int i = 0; i < lineCount; i++) {

red= random.nextInt(255);

green= random.nextInt(128) + 127;

blue= random.nextInt(128) + 127;

g.setColor(newColor(red, green, blue));//初始角度必须大于0

int angRange = random.nextInt(270) + 30;int arcX = random.nextInt(width) - (width >> 4);int arcY =random.nextInt(height);int arcWidth =random.nextInt(width);int arcHeight =random.nextInt(height);int arcStartAng = random.nextInt(angRange) + 1;int arcAng = random.nextInt(angRange) + 1;

g.drawArc(arcX, arcY, arcWidth, arcHeight, arcStartAng, arcAng);

}int offsetX = random.nextInt(5) + 5;int offsetY = random.nextInt(5) + 10;for (int i = 0; i < code.length(); i++) {

String strRand= code.substring(i, i + 1);//产生随机的颜色值,让输出的每个字符的颜色值都将不同。

red = random.nextInt(255);

green= random.nextInt(127);

blue= random.nextInt(255);

g.setColor(newColor(red, green, blue));//正负波动微调

double degree = (random.nextInt(20) - 10) * Math.PI / 180;int fx = (i * x) +offsetX;int fy = codeY -offsetY;

g.rotate(degree, fx, fy);

g.drawString(strRand, fx, fy);//输出完成旋转回来

g.rotate(-degree, fx, fy);

}returnbuffImg;

}

}

java验证码工具_java 验证码工具相关推荐

  1. java验证码技术_java验证码前台技术

    //下面是在前台jsp页面不用导工具的情况下制作的验证码的基本代码 $(function(){ //创建验证码 createCode(); jQuery.validator.addMethod( &q ...

  2. java 开发工具_Java开发工具和环境,你了解多少?

    Java作为今年来最热门的编程语言之一,越来越多的人选择Java,但对于一些初入门的小白来说,在选择和安装开发工具和环境的时候,会遇见很多的问题. 今天就给大家来分享一些实用的Java开发工具和环境, ...

  3. java 下载工具_java文件下载工具类

    java文件工具类是java开发爱好者提供的一个java开源包,让广大java爱好者以及开发者可以直接编译形成class文件进行使用.内容包含io流,图形界面,使用户更好更快的找到相对应文件,并进行相 ...

  4. java 编程工具_Java开发工具可以促进编程!

    java 编程工具 Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法,以使他们的编程工作变得更轻松. 由于情况发生了变化,因此出现了越来越多的工具. 因此,下面列出了大多数开发人员已 ...

  5. java堆排序工具包_JAVA 排序工具类

    提供了以下排序:冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 桶排序 堆排序 package com.xingej.algorithm.sort;import java.util.Arr ...

  6. java 开发屏幕截图工具_Java屏幕截图工具 捕获屏幕

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.awt.BorderLayout; import java.awt ...

  7. java trace工具_Java 诊断工具 Arthas 教程学习笔记

    Java 诊断利器 Arthas,是阿里的一款开源工具.Github-alibaba/arthas 上可以看到它的介绍.了解它,主要是最近对分析 Java 错误堆栈比较感兴趣,机缘巧合看到了它. 本文 ...

  8. java和签名工具_java 证书工具keytool生成自签名证书和自签CA证书

    jdk自带的证书管理工具叫keytool,在jdk/bin目录下,可以用来生成自签名证书.导入导出证书.打印证书信息等. 1. 名词 自签名证书:用自己的私钥签发自己的公钥即主体信息生成的证书. 证书 ...

  9. java 内存泄漏 工具_Java剖析工具JProfiler入门使用教程:查找内存泄漏的方法

    JProfiler的内存视图会话提供了内存使用情况的动态更新视图以及分配点的信息视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象.本文主要介绍如何意识到内存泄漏以及查找内存 ...

最新文章

  1. K:hash(哈希)碰撞攻击
  2. Python常用网页字符串处理技巧
  3. Spring Boot的Tomcat 启动详解
  4. win8系统电脑中病毒了怎么办,如何解决win8电脑中毒
  5. linux下配置防火墙
  6. win7计算机里没有视频,win7没有视频捕捉硬件怎么办
  7. staruml顺序图转通信图_【航图详解】ICAO机场图!
  8. Vuejs vm对象详解
  9. ISO 3166-1标准国家代码表
  10. linux常用命令小结
  11. AWS EFS vs EBS vs S3(差异和何时使用?)
  12. Python自动化运维之1、Python入门
  13. 关于轩辕剑3外传 swd3eDvd.exe报错问题
  14. c语言如何编写对数程序,在C语言中使用对数函数的方法
  15. vue项目系统兼容IE浏览器问题以及解决方案
  16. 洗牌程序c语言原理,C语言经典算法 - 洗牌算法
  17. 7.4 初等矩阵和可逆性
  18. error: no matching function for call QDebug:: QDebug
  19. vtk 显示效果设置
  20. python3实现鼠标键盘动作录制,并还原执行过程

热门文章

  1. SpringBoot2 集成 xxl-job任务调度中心_路由策略
  2. linux crontab定时任务常用梳理
  3. 【Java线程池】Java线程池汇总,看这一篇文章就够了
  4. 工作流实战_18_flowable 流程任务的转办
  5. android mtk 按键,Android 4.0 虚拟按键、手机模式、平板模式(转)
  6. C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程
  7. Python 函数声明和调用 - Python零基础入门教程
  8. 企业开发需要的git提交和拉取代码(本地仓库和github演示)
  9. BugkuCTF-MISC题闪的好快
  10. android unix时间,android: 日期转Unix时间戳,Unix时间戳转日期,带时区