package projectUtil;

 /**
* @author tian
* @date 2019/4/1015:58
*/ import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random; /**
* 验证码生成器
*
*/
public class PicUtil {
// 图片的宽度。
private int width = 120;
// 图片的高度。
private int height = 40;
// 验证码字符个数
private int codeCount = 6;
// 验证码干扰线数
private int lineCount = 3;
// 验证码
private String code = null;
// 验证码图片Buffer
private BufferedImage buffImg = null; private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };
// 生成随机数
private Random random = new Random(); public PicUtil() {
this.createCode();
} /**
*
* @param width 图片宽
* @param height 图片高
*/
public PicUtil(int width, int height) {
this.width = width;
this.height = height;
this.createCode();
} /**
*
* @param width 图片宽
* @param height 图片高
* @param codeCount 字符个数
* @param lineCount 干扰线条数
*/
public PicUtil(int width, int height, int codeCount, int lineCount) {
this.width = width;
this.height = height;
this.codeCount = codeCount;
this.lineCount = lineCount;
this.createCode();
} public void createCode() {
int codeX = 0;
int fontHeight = 0;
fontHeight = height - 5;// 字体的高度
codeX = width / (codeCount + 3);// 每个字符的宽度 // 图像buffer
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics(); // 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height); // 创建字体
// ImgFontByte imgFont = new ImgFontByte();
Font font=new Font("宋体",Font.PLAIN,16);
g.setFont(font); StringBuffer randomCode = new StringBuffer();
// 随机产生验证码字符
for (int i = 0; i < codeCount; i++) {
String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
// 设置字体颜色
g.setColor(getRandomColor());
// 设置字体位置
g.drawString(strRand, (i + 1) * codeX, getRandomNumber(height / 2) + 20);
randomCode.append(strRand);
}
// 利用GeneralPath类来画曲线  
GeneralPath gp = new GeneralPath();
gp.moveTo(0,0); for (int i = 0; i < lineCount; i++) {
// 绘制一个圆弧(弧线)
// void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
// 填充一个圆弧(扇形)
// void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
// drawTanx(gp,g);
// drawCosx(gp,g);
drawSinx(gp,g);
drawSinxDX(gp,g);
// 设置字体颜色
g.setColor(getRandomColor());
// 绘制一个圆弧(弧线)
// g.drawArc(lineCount*getRandomNumber(10), lineCount*getRandomNumber(10), width, height,getRandomNumber(100),lineCount*getRandomNumber(100)%2==1?-lineCount*getRandomNumber(360):lineCount*getRandomNumber(1872));
}
code = randomCode.toString();
} /** 获取随机颜色 */
private Color getRandomColor() {
int r = getRandomNumber(255);
int g = getRandomNumber(255);
int b = getRandomNumber(255);
return new Color(r, g, b);
} /** 获取随机数 */
private int getRandomNumber(int number) {
return random.nextInt(number);
} public void write(String path) throws IOException {
OutputStream sos = new FileOutputStream(path);
this.write(sos);
} public void write(OutputStream sos) throws IOException { ImageIO.write(buffImg, "png", sos);
sos.flush();
sos.close();
} public BufferedImage getBuffImg() {
return buffImg;
} public String getCode() {
return code;
} public static void main(String[] args) throws IOException {
for (int i = 0; i <5 ; i++) {
new PicUtil(){{
this.write("D:/yy/"+super.code+".png");
}};
} } private void drawTanx(GeneralPath gp, Graphics2D g2d) {
for (double i = 0.000001; i <= 8*Math.PI; i+=0.0001*Math.PI) {
gp.lineTo(20*i, 100*-Math.tan(i));
}
g2d.draw(gp); // 将当前画笔以原点为中心,旋转180度,画奇函数(关于原点对称)
g2d.rotate(Math.PI);
g2d.draw(gp);
} private void drawCosx(GeneralPath gp, Graphics2D g2d) {
for (double i = 0.000001; i <= 8*Math.PI; i+=0.0001*Math.PI) {
gp.lineTo(20*i, 100*-Math.cos(i));
}
g2d.draw(gp); // 将当前画笔以Y中为对称轴,画偶函数(关于Y轴对称)
g2d.scale(-1, 1);
g2d.draw(gp);
}
private void drawSinx(GeneralPath gp, Graphics2D g2d) {
for (double i = 0.000001; i <= 8*Math.PI; i+=0.0001*Math.PI) {
gp.lineTo(15*i, 100*-Math.sin(i));
}
g2d.draw(gp);
g2d.rotate(Math.PI*0.01*getRandomNumber(100));
g2d.draw(gp);
} private void drawSinxDX(GeneralPath gp, Graphics2D g) {
for (double i = 0.1; i <= 8*Math.PI; i+=0.0001*Math.PI) {
gp.lineTo(20*i, -100*-Math.sin(i)/i);
}
g.draw(gp);
g.scale(-1, 1);
g.draw(gp);
} } 网上有类似的代码,但独独只有生成的文字没有干扰线。所以花了点时间完善了一下,发上来,如果有需要请拿走。

一篇Java图片验证码生成的代码的更多相关文章

  1. Java图片验证码生成工具

    直接把以下代码拷贝使用: import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;impo ...

  2. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  3. php 图片验证码生成 前后台验证

    自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...

  4. Atitit 图片 验证码生成attilax总结

    Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字  打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...

  5. [转]php 图片验证码生成 前后台验证

    本文转自:https://www.cnblogs.com/xiaoyezi/p/3541195.html 自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一 ...

  6. java图片操作--生成与原图对称的图片

    java图片操作--生成与原图对称的图片 package com.pay.common.util; import java.awt.image.BufferedImage; import java.i ...

  7. Flask实战第40天:图片验证码生成技术

    图片验证码生成 安装pillow pip install pillow 在utils下新建python package命名为captcha 把需要需要用到的字体放在captcha下 编辑captcha ...

  8. Web后端 JAVA实现验证码生成与验证功能

    首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color;  impor ...

  9. JavaWeb开发之普通图片验证码生成技术与算术表达式验证码生成技术

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134649.html    另:算术验证码生成的JSP.Servlet实现均已移植github:https:/ ...

随机推荐

  1. Python3+Apache+Django+CentOS

    使用django开发的项目上到正式环境的环境搭建,系统软件版本: CentOS6. setuptools-.tar.gz pip-.tar.gz Python-.tgz pcre-8.39.tar.b ...

  2. struts2 和 js 标签取值

    struts标签是在服务器上替换成html代码的,js是在用户浏览器执行的,这个顺序如果没搞清楚你是搞不好web开发的

  3. SocketAsyncEventArgs

    SocketAsyncEventArgs是.net提供的关于异步socket类,封装了IOCP的使用,可以用它方便的实现NIO(non-blocking IO) NIO对于提升某些场景下Server性 ...

  4. Android性能分析Systrace工具

    一.概述 保证系统流畅度,也就是保证系统能连续不间断地提供每秒60帧的运行状态.当出现掉帧时(也可称为Jank),需要知道当前整个系统所处的状态,systrace便是最佳的选择,它能手机检测Andro ...

  5. 学习python3

    定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定 ...

  6. 你不知道的Console

    1.凡人视角 打印字符串 代码: console.log("I am a 凡人"); 打印提示消息 代码: console.info("Yes, you arm a 凡人 ...

  7. Vue.js的库,包,资源的列表大全。

    官方资源 外部资源 社区 播客 官方示例 入门 开发工具 语法高亮 代码片段 自动补全 组件集合 库和插件 路由 ajax/数据 状态管理 校验 UI组件 i18n 示例 模板 脚手架 整合 插件/指 ...

  8. http-bio-8080"-exec-6

    现象如下:   Tomcat7启动后,后台抛出如下异常,前台一直无法登陆   Exception in thread ""http-bio-8080"-exec-6&qu ...

  9. linux命令の删除文件和文件夹 复制粘贴文件和文件夹

    声明:此博文来自百度经验http://jingyan.baidu.com/article/642c9d34dcba80644a46f72d.html,谢谢分享! linux删除目录很简单,很多人还是习 ...

  10. Arcgis Android 手动搭建开发环境

    前言 本文为大家分享arcgis android 环境的手动搭建过程,默认你懂一定的java和android 基础知识,已经有android的开发环境.如缺乏以上环境和知识,请自行补充. 版本介绍 A ...