import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import java.util.UUID;
import javax.imageio.ImageIO;
public class VerifyImageUtil {
public static String generate(OutputStream out) {
Random rand = new Random(System.currentTimeMillis());
// 图片宽高
int width = 80 + rand.nextInt(25);
int height = 28 + rand.nextInt(10);
Graphics2D g = null;
String value = null;
try {
BufferedImage bimage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
g = bimage.createGraphics();
// 设置随机背景色
Color color = new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
// 填充深色背景
g.setColor(color.darker());
g.fillRect(0, 0, width, height);
// 设置字体
g.setFont(new Font("arial", Font.BOLD, 36));
// 随机生成字符,根据截取的位数决定产生的数字
value = UUID.randomUUID().toString().replace("-", "").substring(0,4);
int w = (g.getFontMetrics()).stringWidth(value);
int d = (g.getFontMetrics()).getDescent();
int a = (g.getFontMetrics()).getMaxAscent();
int x = 0, y = 0;
// 设置随机线条,15这个数值越大图片中线条越稀蔬
for (int i = 0; i < height;) {
i += 8 + rand.nextInt(15);
g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));
g.drawLine(x, y + i, width, y + i);
}
// reset x and y
x = 0;
y = 0;
// 设置随机线条,15这个数值越大图片中线条越稀蔬
for (int i = 0; i < height;) {
i += 8 + rand.nextInt(15);
g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));
g.drawLine(x, y + d - i, width + w, height + d - i);
}
// 展示验证码中颜色,随机
g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)).brighter());
// 设置文字出现位置为中央
x = width / 2 - w / 2;
y = height / 2 + a / 2 - 6;
// 文字变形设置
AffineTransform fontAT = new AffineTransform();
int xp = x - 2;
// 每个文字都变形
for (int c = 0; c < value.length(); c++) {
// 产生弧度
int rotate = rand.nextInt(25);
fontAT.rotate(rand.nextBoolean() ? Math.toRadians(rotate):-Math.toRadians(rotate / 2));
Font fx = new Font(new String[] { "Times New Roman", "Verdana","arial" }[rand.nextInt(2)], rand.nextInt(5), 20 + rand.nextInt(16)).deriveFont(fontAT);
g.setFont(fx);
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
Random random = new Random();
int red = random.nextInt(255);
int green = random.nextInt(255);
int blue = random.nextInt(255);
// 用随机产生的颜色将验证码绘制到图像中。
g.setColor(new Color(red, green, blue));
String ch = String.valueOf(value.charAt(c));
int ht = rand.nextInt(3);
// 打印字并移动位置
g.drawString(ch, xp, y + (rand.nextBoolean() ? -ht : ht));
// 移动指针.
xp += g.getFontMetrics().stringWidth(ch) + 2;
}
// 打印出图片
ImageIO.write(bimage, "png", out);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (g != null)
g.dispose();
if (out != null)
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return value;
}
//for test
public static void main(String args[]) throws FileNotFoundException {
System.out.println(generate(new FileOutputStream("D:/verify.png")));
}
}
分享到:
相关推荐
下面将详细介绍这个验证码生成程序的关键知识点。 首先,验证码的核心在于随机性和复杂性,确保它既难于机器识别,又易于人类辨认。Python中的`Pillow`库是`PIL`(Python Imaging Library)的一个分支,它提供了...
总之,C#实现的验证码生成程序是Web安全中不可或缺的一部分,它结合了随机数生成、图形处理和会话管理等多个技术。通过深入理解并定制这个`CheckCode`程序,我们可以创建出满足特定需求的安全验证码解决方案。
验证码生成工具类是一种在Web应用中广泛使用的安全机制,它主要用于防止自动化的恶意操作,比如机器人注册、垃圾邮件发送等。这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和...
【VB实现验证码生成小程序】 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,通常用于网站登录、注册等场景,防止恶意脚本或机器人攻击。在VB(Visual Basic)环境中,我们可以利用图形处理技术来创建一个...
总之,图片验证码是网站和应用程序安全的重要组成部分,"图片验证码生成demo"是一个实践性的学习资源,可以帮助你掌握验证码的生成技术和原理。通过深入研究和实践,你将能够创建自己的定制化验证码解决方案,以适应...
5. **字体选择与混淆**:验证码的字体通常不规则,可以选择多种字体混搭,甚至自定义特殊字体。Java的`java.awt.Font`类可用于创建和设置字体样式。 6. **图像保存与HTTP响应**:生成的验证码图像需要以特定格式...
2. **扭曲与变形**:为了增加机器识别的难度,验证码图片中的字符会经过扭曲、倾斜、缩放、旋转等图像处理技术,使得字符形状不规则。 3. **噪点与线条**:添加随机的噪点和线条可以进一步混淆机器视觉,但不影响...
在本案例中,我们探讨的是一个使用Visual Basic (VB) 编程语言创建的简单验证码生成程序。这个程序可能并非特别复杂,但对于初学者来说,它是理解验证码生成原理的良好起点。 在VB中,验证码的生成通常涉及到以下几...
下面我们将深入探讨如何使用JavaScript实现验证码生成。 首先,验证码的基本原理是创建一组随机字符,通常是数字和字母的组合,然后将其显示给用户,让用户输入以验证其身份。在JavaScript中,我们可以利用Math对象...
本主题聚焦于“易语言验证码生成模块与列程”,这是一个关于在易语言环境中创建验证码生成程序的教学资源。 验证码(CAPTCHA)是Completely Automated Public Turing test to tell Computers and Humans Apart的...
本项目提供的是一款用Java编写的验证码生成工具,包括showyanzhengma.exe可执行文件、yanzhengma6(50).exe以及yanzhengma6(50).jar文件。 验证码的生成通常包含以下几个关键步骤: 1. **随机字符生成**:验证码...
在"ValidateCode"这个文件中,很可能是实现了以上步骤的一个验证码生成类。通过理解和使用这个类,开发者可以快速集成安全的随机数字验证码到自己的应用程序中,增强系统的安全性。 总的来说,验证码随机生成数字类...
这个压缩包文件“图形验证码生成合集”集合了多种类型的Java实现的验证码生成器,包括数字计算验证码、中文验证码、简单验证码以及复杂条纹验证码,这些都为开发者提供了丰富的选择来增强网站或应用的安全性。...
验证码生成的流程通常包括以下几个步骤: 1. **生成随机数字或字母**:验证码通常由一组随机的字符组成,可以是数字、字母,甚至包括特殊字符。在JSP中,我们可以使用`java.util.Random`类来生成随机数,然后通过...
验证码图片生成技术是一种常见的安全措施,...在实际应用中,开发者可能会结合这些基本功能,编写出符合项目需求的完整验证码生成程序。通过易语言,初学者也能快速理解验证码的生成原理,并动手实现自己的验证码系统。
ASP.NET验证码生成是一个重要的安全措施,用于防止自动化脚本或机器人程序进行非法操作,如注册、登录、提交表单等。验证码的主要目的是确保用户是人类,而非机器。在这个项目中,我们将探讨如何在ASP.NET环境下生成...
验证码是Web应用中常用的一种安全机制,用于...通过学习和使用`kaptcha`或其他验证码生成库,开发者能够快速地在自己的项目中实现这一功能。同时,理解和实现验证码的生成也能加深对Java图形编程以及安全原理的理解。
标签中的“经典”意味着这种验证码生成方式是一种常用且成熟的技术,尽管现在有更先进的技术如滑动验证、点击验证等,但彩色字符验证码依然广泛应用于各种Web应用中。 总之,Java生成彩色验证码涉及图像处理、...
这个压缩包可能包含必要的源代码、文档和其他资源,帮助开发者了解和实现验证码生成的过程。 验证码生成的核心是将随机生成的文字与图像背景相结合,形成一种人类容易识别但计算机难以自动解析的图像。下面,我们将...
在这个场景中,我们使用Servlet来生成图片验证码,这是一种防止恶意自动化程序(如机器人)进行非法操作的安全机制。验证码通常是一串随机生成的字符,以图像形式显示,用户需要在输入框中正确输入才能完成验证。 ...