`
songdawei001
  • 浏览: 51856 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

变形 不规则的验证码生成程序

    博客分类:
  • java
阅读更多

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")));
	}
}
分享到:
评论

相关推荐

    python3中图片验证码生成程序

    下面将详细介绍这个验证码生成程序的关键知识点。 首先,验证码的核心在于随机性和复杂性,确保它既难于机器识别,又易于人类辨认。Python中的`Pillow`库是`PIL`(Python Imaging Library)的一个分支,它提供了...

    C#实现的验证码生成程序

    总之,C#实现的验证码生成程序是Web安全中不可或缺的一部分,它结合了随机数生成、图形处理和会话管理等多个技术。通过深入理解并定制这个`CheckCode`程序,我们可以创建出满足特定需求的安全验证码解决方案。

    验证码生成工具类

    验证码生成工具类是一种在Web应用中广泛使用的安全机制,它主要用于防止自动化的恶意操作,比如机器人注册、垃圾邮件发送等。这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和...

    自动生成验证码的小程序 VB

    【VB实现验证码生成小程序】 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,通常用于网站登录、注册等场景,防止恶意脚本或机器人攻击。在VB(Visual Basic)环境中,我们可以利用图形处理技术来创建一个...

    图片验证码生成demo

    总之,图片验证码是网站和应用程序安全的重要组成部分,"图片验证码生成demo"是一个实践性的学习资源,可以帮助你掌握验证码的生成技术和原理。通过深入研究和实践,你将能够创建自己的定制化验证码解决方案,以适应...

    页面验证码生成器

    5. **字体选择与混淆**:验证码的字体通常不规则,可以选择多种字体混搭,甚至自定义特殊字体。Java的`java.awt.Font`类可用于创建和设置字体样式。 6. **图像保存与HTTP响应**:生成的验证码图像需要以特定格式...

    一个小的验证码图片生成程序

    2. **扭曲与变形**:为了增加机器识别的难度,验证码图片中的字符会经过扭曲、倾斜、缩放、旋转等图像处理技术,使得字符形状不规则。 3. **噪点与线条**:添加随机的噪点和线条可以进一步混淆机器视觉,但不影响...

    十分简单的VB生成验证码程序

    在本案例中,我们探讨的是一个使用Visual Basic (VB) 编程语言创建的简单验证码生成程序。这个程序可能并非特别复杂,但对于初学者来说,它是理解验证码生成原理的良好起点。 在VB中,验证码的生成通常涉及到以下几...

    js验证码生成

    下面我们将深入探讨如何使用JavaScript实现验证码生成。 首先,验证码的基本原理是创建一组随机字符,通常是数字和字母的组合,然后将其显示给用户,让用户输入以验证其身份。在JavaScript中,我们可以利用Math对象...

    易语言验证码生成模块与列程

    本主题聚焦于“易语言验证码生成模块与列程”,这是一个关于在易语言环境中创建验证码生成程序的教学资源。 验证码(CAPTCHA)是Completely Automated Public Turing test to tell Computers and Humans Apart的...

    验证码的生成工具 Java

    本项目提供的是一款用Java编写的验证码生成工具,包括showyanzhengma.exe可执行文件、yanzhengma6(50).exe以及yanzhengma6(50).jar文件。 验证码的生成通常包含以下几个关键步骤: 1. **随机字符生成**:验证码...

    验证码随机生成数字类

    在"ValidateCode"这个文件中,很可能是实现了以上步骤的一个验证码生成类。通过理解和使用这个类,开发者可以快速集成安全的随机数字验证码到自己的应用程序中,增强系统的安全性。 总的来说,验证码随机生成数字类...

    图形验证码生成合集

    这个压缩包文件“图形验证码生成合集”集合了多种类型的Java实现的验证码生成器,包括数字计算验证码、中文验证码、简单验证码以及复杂条纹验证码,这些都为开发者提供了丰富的选择来增强网站或应用的安全性。...

    验证码生成jsp 代码

    验证码生成的流程通常包括以下几个步骤: 1. **生成随机数字或字母**:验证码通常由一组随机的字符组成,可以是数字、字母,甚至包括特殊字符。在JSP中,我们可以使用`java.util.Random`类来生成随机数,然后通过...

    易语言验证码图片生成

    验证码图片生成技术是一种常见的安全措施,...在实际应用中,开发者可能会结合这些基本功能,编写出符合项目需求的完整验证码生成程序。通过易语言,初学者也能快速理解验证码的生成原理,并动手实现自己的验证码系统。

    asp.net 验证码生成(含源码)

    ASP.NET验证码生成是一个重要的安全措施,用于防止自动化脚本或机器人程序进行非法操作,如注册、登录、提交表单等。验证码的主要目的是确保用户是人类,而非机器。在这个项目中,我们将探讨如何在ASP.NET环境下生成...

    java生成验证码的参考资料(中英文验证码)

    验证码是Web应用中常用的一种安全机制,用于...通过学习和使用`kaptcha`或其他验证码生成库,开发者能够快速地在自己的项目中实现这一功能。同时,理解和实现验证码的生成也能加深对Java图形编程以及安全原理的理解。

    java彩色验证码的生成

    标签中的“经典”意味着这种验证码生成方式是一种常用且成熟的技术,尽管现在有更先进的技术如滑动验证、点击验证等,但彩色字符验证码依然广泛应用于各种Web应用中。 总之,Java生成彩色验证码涉及图像处理、...

    vc++ 根据文字生成图片 文字图片验证码.zip

    这个压缩包可能包含必要的源代码、文档和其他资源,帮助开发者了解和实现验证码生成的过程。 验证码生成的核心是将随机生成的文字与图像背景相结合,形成一种人类容易识别但计算机难以自动解析的图像。下面,我们将...

    Servlet生成图片验证码

    在这个场景中,我们使用Servlet来生成图片验证码,这是一种防止恶意自动化程序(如机器人)进行非法操作的安全机制。验证码通常是一串随机生成的字符,以图像形式显示,用户需要在输入框中正确输入才能完成验证。 ...

Global site tag (gtag.js) - Google Analytics