- 浏览: 33614 次
- 性别:
- 来自: 上海
文章分类
最新评论
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import org.apache.commons.lang3.StringUtils;
/**
* 图片验证码类
*/
public class Captcha {
private int width = 100;
private int height = 30;
private Random random = new Random();
private BufferedImage image;
/** 验证码图片上显示的字符 */
private String code;
/** 波形的幅度倍数,越大扭曲的程序越高,一般为3 */
private int twistLevel = 2;
/** 干扰线数量 */
private int noiseLineNumber = 3;
/** 背景色 */
private Color backgroundColor = Color.WHITE;
/** 字体颜色 */
// private Color foregroundColor = Color.BLACK;
private Color[] colors = { Color.BLUE, Color.RED, Color.GREEN, Color.BLACK, Color.CYAN, Color.MAGENTA };
private Color getRandomColor() {
return colors[random.nextInt(colors.length)];
}
/**
* @param width
* - 验证码图片宽度
* @param height
* - 验证码图片高度
* @param randomStr
* - 随机字符串
* @return
*/
public Captcha generate(int width, int height, String randomStr) {
this.width = width;
this.height = height;
this.code = randomStr;
if (StringUtils.isBlank(code)) {
throw new RuntimeException("randomStr can not be empty.");
}
int xWidth = width / (code.length() + 2);
int yIndex = height - 4;
Graphics2D graphics = graphicsInit();
for (int i = 0; i < code.length(); i++) {
// graphics.setColor(foregroundColor);
graphics.setColor(getRandomColor());
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.drawString(code.charAt(i) + "", (i + 1) * xWidth, yIndex);
}
setBuffImg(disturb());
return this;
}
private Graphics2D graphicsInit() {
Graphics2D graphics = buffImgInit().createGraphics();
graphics.setColor(backgroundColor);
graphics.fillRect(0, 0, width, height);
graphics.setFont(new Font("Fixedsys", Font.ITALIC, height - 2));
graphics.drawRect(0, 0, width - 1, height - 1);
return graphics;
}
private BufferedImage buffImgInit() {
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
return image;
}
private BufferedImage disturb() {
drawNoiseLine(image.createGraphics());
return twistImage();
}
private void drawNoiseLine(Graphics2D graphics) {
int x = 0;
int y = 0;
int xl = 0;
int yl = 0;
for (int i = 0; i < noiseLineNumber; i++) {
x = random.nextInt(width * 2 / 3);
y = random.nextInt(height * 2 / 3);
xl = random.nextInt(width / 2);
yl = random.nextInt(height / 2);
// graphics.setColor(foregroundColor);
graphics.setColor(getRandomColor());
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.drawLine(x, y, x + xl, y + yl);
}
}
private BufferedImage twistImage() {
double dMultValue = random.nextInt(9) + twistLevel;
double dPhase = random.nextInt(6);// 波形的起始相位,取值区间(0-2*PI)
BufferedImage destBi = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = destBi.createGraphics();
graphics.setColor(backgroundColor);
graphics.fillRect(0, 0, width, height);
for (int i = 0; i < destBi.getWidth(); i++) {
for (int j = 0; j < destBi.getHeight(); j++) {
int nOldX = getXPosition4Twist(dPhase, dMultValue, destBi.getHeight(), i, j);
int nOldY = j;
if (nOldX >= 0 && nOldX < destBi.getWidth() && nOldY >= 0 && nOldY < destBi.getHeight()) {
destBi.setRGB(nOldX, nOldY, image.getRGB(i, j));
}
}
}
return destBi;
}
private int getXPosition4Twist(double dPhase, double dMultValue, int height, int xPosition, int yPosition) {
double PI = Math.PI; // 此值越大,扭曲程度越大
double dx = (double) (PI * yPosition) / height + dPhase;
double dy = Math.sin(dx);
return xPosition + (int) (dy * dMultValue);
}
public BufferedImage getImage() {
return image;
}
public void setBuffImg(BufferedImage buffImg) {
this.image = buffImg;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
使用示例:
Java代码 收藏代码
String randomStr = RandomStringUtils.randomAlphabetic(4).toLowerCase();
request.getSession().setAttribute(KEY_CAPTCHA, randomStr);
BufferedImage bi = new Captcha().generate(200, 50, randomStr).getImage();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
encoder.encode(bi);
ImageIO.write(bi, "JPEG", response.getOutputStream());
发表评论
-
js页面缓存的一个解决办法
2013-12-06 18:02 0CSSOSAnt浏览器JavaScript 由于 ... -
解决js缓存地址问题
2013-12-06 17:56 637解决js缓存地址问题 js实现不缓存 <ME ... -
URL URI URN
2013-12-06 17:51 592总结如下: 1.简写: URI (uniform resour ... -
URI和URL的区别
2013-12-06 17:47 645这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Jav ... -
display标签交替显示不同行颜色
2013-12-06 17:41 598问题 想要一个更加简单的支持列表数据分页和排序的方法。 解决方 ... -
display标签简介
2013-12-06 17:36 417下面是网友总结的displa ... -
MyEclipse中无法将SVN检出来的项目部署到tomcat中
2013-12-04 15:39 484自己遇到的小问题 : 要以web项目方式从svn上倒下来才 ... -
jsp转换成html
2013-11-28 16:42 632相信很多人都希望自己的页面越快越好,最好是能静态的,提高 ... -
Java验证码
2013-11-28 15:11 409Java生成验证码图片 1.Servlet生成验证码图片 ... -
MVC 包命名规范
2013-11-22 12:44 700mvcdaoobjectactionstruts框架 本文为开 ... -
基于注解的SpringMVC简单介绍
2013-11-15 13:26 563mvcspringSpringMVC注解简单用法 Sprin ... -
JSP、Servlet中的相对路径和绝对路径
2013-11-15 13:09 559http://www.webjx.com 更新日期:200 ... -
jsp相对路径绝对路径
2013-11-15 12:57 392jsp相对路径绝对路径 ... -
JSP自定义标签rtexprvalue属性
2013-11-15 11:28 394JSP自定义标签rtexprvalue属性 分类: J2EE ... -
EL表达式 参考手册
2013-11-14 17:29 315一、EL简介 1.语法结构 ${expression ... -
springMVC+JDBC:分页示例
2013-11-13 15:30 860文章来源:http://liuzidong.iteye.c ... -
spring mvc 分页
2013-11-13 15:20 502springmvcstringhibernatesession ... -
get/post时中文乱码问题的解决办法
2013-11-13 14:00 396jspurlservlettomcat浏览器服 ... -
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解
2013-11-05 11:29 765HTML:scrollLeft,scrollWidth,c ...
相关推荐
Java图片验证码工具类是一种在Web应用中用于防止恶意自动化操作(如机器人)的常用安全机制。它通过生成随机的字符序列并将其显示为图片来工作,用户需要输入看到的字符才能完成验证。以下是对这个Java工具类的详细...
JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码
### Java 图片验证码实现原理与代码解析 #### 一、概述 在许多网站或应用程序中,为了防止机器人的恶意操作,经常会使用到图形验证码。Java 图片验证码是一种常见的实现方式,它通过生成具有一定随机性的图像,并...
验证码(Vercode)是网络应用中常用的一种...总的来说,创建Java图片验证码涉及多个技术点,包括字符串生成、图像处理、随机数生成等。通过理解并实践这些技术,开发者可以创建出适合自己应用的高效安全的验证码系统。
这个"java-图片验证码.zip"压缩包包含了一个实现Java图片验证码功能的工具类(VerifyUtil.java)和一个具体的控制器(AppPicCodeController.java),用于处理验证码的生成与验证。 首先,我们来详细了解一下`...
好看的图片验证码,包含干扰线、噪点、扭曲图片等。。
java解析图片验证码
java图片验证码 选择 VerificationImage 基本上修改过后能够满足大部分的需求,其中注释也比较详尽,方便阅读和修改
Java 图片验证码是一种常见的安全措施,用于防止自动化脚本或机器人进行恶意操作,如批量注册、恶意登录等。在Web开发中,Java 提供了多种实现图片验证码的方式。本教程将详细讲解如何在Java Web项目中创建并使用...
在这个“java-验证码识别-验证码破解”的主题中,我们将深入探讨如何使用Java进行验证码识别,特别是通过Tess4J库进行OCR(光学字符识别)。 验证码的主要目的是防止自动化的恶意行为,如机器人攻击或垃圾邮件发送...
java生成验证码的工具类,这个现在有依赖可以直接引入调用,但这个工具类没有引入依赖,大家也容易看懂代码,理解其含义。也可直接去工具类中调整生成验证码的宽度、高度、颜色、背景颜色、生成的随机数数量、干扰线...
源码提供了一个生成图片验证码的工具类,适用于各种需要验证码的场景,如用户注册、登录等。该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。...
包含5个识别图片验证码的类,分别对应不同5种不同的验证码 其中用了两种不同的实现方式(截取采样像素比对+Tesseract-OCR识别) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法实现)
java图片验证码生成。有干扰线。随机字符。
### Java 图片验证码实现原理与示例解析 #### 一、引言 随着网络安全的重要性日益增加,验证码成为了网站登录及表单提交时不可或缺的一部分。它主要用于区分操作者是人类还是自动程序,以此来防止恶意软件的攻击。...
csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四种验证码生成集合。将生成的四个验证图片放在一个页面上以供比对,全部可以运行。 四种方法分别为: 1. 数字、字母、汉字混合验证码,叠影(给力)、扭曲 ...
java 生成随机图片验证码 ,字母数组随机组合,加干扰线