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. Samba文件服务器安装配置

    很久都没有更新博客了,人要学好难,跟着学坏容易,这个其实是我一直以来不明白的地方.如果,能反过来,应该是很多人求之不得的美事吧.说远了,我就是这种一放松下来,就容易堕落的一份子. 最近也是工作的原因, ...

  2. http 错误代码

    2xx  成功  200  正常:请求已完成.  201  正常:紧接 POST 命令.  202  正常:已接受用于处理,但处理尚未完成.  203  正常:部分信息 — 返回的信息只是一部分.   ...

  3. 【转载】python计算文件的行数和读取某一行内容的实现方法

    一.计算文件的行数 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: count = len(o ...

  4. Understanding sun.misc.Unsafe

    转自: https://dzone.com/articles/understanding-sunmiscunsafe The biggest competitor to the Java virtua ...

  5. Hibernate Validator bean-validator-3.0-JBoss-4.0.2

    信息: Hibernate Validator bean-validator-3.0-JBoss-4.0.2 后面是一大段错误信息不贴出来了... 解决方案:hibernate配置文件中加入 < ...

  6. Android-下载网上图片

    下载操作相关代码: package liudeli.async; import android.app.Activity; import android.app.ProgressDialog; imp ...

  7. selenium+jenkins+maven+testNG搭建持续集成环境

    为了简明起见,分几大部分,很基础的细节就不详述了 一·安装jenkins 二·创建一个maven项目的job 2.1   填上SVN的Repository URL 2.2  由于是在本地执行maven ...

  8. C语言顺序结构和分支结构总结

    1. 本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 感觉学的内容比较基础,也是日后编程的基石.今后还应多加练习,能够更自如地运用,避免低级错误,一步步地提 ...

  9. iOS检测项目图片资源是否包含P3图片

    1.问题描述 我们需要知道的是在iOS9.3以下系统上,.ipa包内如果含有p3图片,将会导致严重的闪退问题,具体原因还请google,非本文的重点. 2.问题解决 拿到的如果是ipa包(不是则跳过) ...

  10. python列表重复判断

    import random import string n = 0; while n<10: str_source = string.ascii_letters + string.digits ...