`
javaeeboy
  • 浏览: 12124 次
  • 性别: Icon_minigender_1
  • 来自: 汕头
社区版块
存档分类
最新评论

制作美观的验证码图片

阅读更多
package pic.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdentifyingCode {

    /**
     * 验证码长度
     */
    int length = 4;

    /**
     * 验证码字体大小
     */
    int fontSize = 30;

    /**
     * 边框补
     */
    int padding = 0;

    /**
     * 是否输出燥点(默认输出)
     */
    boolean chaos = true;

    /**
     * 输出燥点的颜色(默认灰色)
     */
    Color chaosColor = Color.lightGray;

    /**
     * 自定义背景色(默认白色)
     */
    Color backgroundColor = Color.white;

    /**
     * 自定义字体数组
     */
    String[] fonts = { "Arial", "Georgia","Times New Roman","Blue","Yellow" };

    /**
     * 自定义随机码字符串序列(使用逗号分隔)
     */
    String codeSerial = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

    /**
     * 产生波形滤镜效果
     */
   private final double PI = 3.1415926535897932384626433832799;//此值越大,扭曲程度越大
    /**
     * 字体长度的一对方法
     * @return
     */
    public int getLength() {
            return length;
    }

    public void setLength(int length) {
            this.length = length;
    }
    /**
     * 字体长度的一对方法
     * @return
     */
    public int getFontSize() {
            return fontSize;
    }

    public void setFontSize(int fontSize) {
            this.fontSize = fontSize;
    }
/**
 * 边框的一对方法
 * @return
 */
    public int getPadding() {
            return padding;
    }

    public void setPadding(int padding) {
            this.padding = padding;
    }
/**
 * 是否输出躁点的一对方法
 * @return
 */
    public boolean isChaos() {
            return chaos;
    }

    public void setChaos(boolean chaos) {
            this.chaos = chaos;
    }
/**
 * 躁点的颜色
 * @return
 */
    public Color getChaosColor() {
            return chaosColor;
    }

    public void setChaosColor(Color chaosColor) {
            this.chaosColor = chaosColor;
    }
/**
 * 背景颜色
 * @return
 */
    public Color getBackgroundColor() {
            return backgroundColor;
    }

    public void setBackgroundColor(Color backgroundColor) {
            this.backgroundColor = backgroundColor;
    }
/**
 * 自定义字体样式的数组
 * @return
 */
    public String[] getFonts() {
            return fonts;
    }

    public void setFonts(String[] fonts) {
            this.fonts = fonts;
    }
/**
 * 自定义随机码字符串序列,表示可输出的数字的范围
 * @return
 */
    public String getCodeSerial() {
            return codeSerial;
    }

    public void setCodeSerial(String codeSerial) {
            this.codeSerial = codeSerial;
    }

    /**
     * 给定范围获得随机颜色
     * 
     * @param fc
     * @param bc
     * @return
     */
    private Color getRandColor(int fc, int bc) {
            Random random = new Random();
            if (fc > 255)
                    fc = 255;
            if (bc > 255)
                    bc = 255;
            int r = fc + random.nextInt(bc - fc);
            int g = fc + random.nextInt(bc - fc);
            int b = fc + random.nextInt(bc - fc);
            return new Color(r, g, b);
    }

    /**
     * 生成校验码图片
     * 
     * @param code
     * @return
     */
    private BufferedImage CreateImageCode(String code) {
            int fWidth = this.fontSize + this.padding;
            
            //图象的宽度
            int imageWidth = (int) (code.length() * fWidth) + 4 + this.padding * 2;
            //图象的高度
            int imageHeight = this.fontSize*2 ;

            // 在内存中创建图象
            BufferedImage bi = new BufferedImage(imageWidth, imageHeight,
                            BufferedImage.TYPE_INT_RGB);
            //创建画笔
            Graphics graphics = bi.getGraphics();

            // 将位图填充背景色
            graphics.setColor(this.backgroundColor);
            graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight());

            // 生成随机类
            Random random = new Random();

            // 给背景添加随机生成的燥点,使图象中的认证码不易被其它程序探测到
            if (this.chaos) {
                    int c = this.length * 10;
                    for (int i = 0; i < c; i++) {
                            int x = random.nextInt(bi.getWidth());
                            int y = random.nextInt(bi.getHeight());
                            graphics.setColor(this.chaosColor);// 设置燥点的颜色
                            graphics.drawRect(x, y, 1, 1);// 生成燥点
                           //graphics.drawLine(x, y, y, x);//生成干扰线
                    }
            }
            // 随机字体和颜色的验证码字符
            for (int i = 0; i < code.length(); i++) {
                    
                    //设置字体属性
                    int findex = random.nextInt(this.fonts.length);
                    Font font = new Font(fonts[findex], Font.BOLD, this.fontSize);
                    graphics.setFont(font);
                    
                    int top = (int) ((imageHeight + code.length()*2) / 1.5);
                    if (i % 2 != 1) {
                            top = top - code.length();
                    }
                    int left = i * fWidth+code.length();
                    graphics.setColor(this.getRandColor(1 + i, 250 - i));

                    try {
                            graphics.drawString(code.substring(i, i + 1), left, top);
                    } catch (StringIndexOutOfBoundsException e) {
                            System.out.print(e.toString());
                    }
            }

            // 画一个边框,边框颜色为Color.gray
            graphics.setColor(Color.gray);
            graphics.drawRect(0, 0, bi.getWidth() - 1, bi.getHeight() - 1);

            // 图象生效
            graphics.dispose();

            // 产生波形
            //bi = TwistImage(bi, true, 8, 4);

            return bi;
    }

    /**
     * 将创建好的图片输出到页面
     * 
     * @param bi
     * @param response
     */
    public void CreateImageOnPage(String code,  HttpServletResponse response) {
            // 设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);

            // 获取验证码图片
            BufferedImage bi = this.CreateImageCode(code);
            ServletOutputStream os = null;
            try {
            		os = response.getOutputStream();
                    // 输出图象到页面,参数1是画板,参数2是后缀名,参数三是输出流
                    ImageIO.write(bi,"JPEG", os);
                    
            } catch (IOException e) {
                    e.printStackTrace();
            } finally {
            	if(os != null)
					try {
						os.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
            }            
            
    }

    /**
     * 生成随机字符码
     * 
     * @param codeLen
     *            生成字符码的个数,0则默认的个数
     * @return
     */
    public String CreateVerifyCode(int codeLen) {
            if (codeLen == 0) {
                    codeLen = this.length;
            }
            String[] arr = this.codeSerial.split(",");
            String code = "";
            int randValue = -1;
            Random random = new Random();
            for (int i = 0; i < codeLen; i++) {
                    randValue = random.nextInt(arr.length - 1);
                    code += arr[randValue];
            }
            return code;
    }
    /**
     * 生成随机码,默认的方法
     * @return
     */
    public String CreateVerifyCode(){
    	return this.CreateVerifyCode(this.length);
    }
    
}



引用

接下来的是测试类
IdentifyingCode io = new IdentifyingCode();
//在这里调用CreateVerifyCode()方法产生随机数,下面是4位
String picNum = io.CreateVerifyCode(4);
//然后生成图片
io.CreateImageOnPage(picNum, response);

分享到:
评论

相关推荐

    验证码图片生成器,java源码

    验证码图片生成器是一种用于网络安全验证的技术,主要用于防止自动化的机器人或恶意软件进行非法操作,如批量注册、恶意登录等。这个Java源码实现的验证码生成器具有易用性且适应性强,可以根据需求调整验证码的类型...

    易语言验证码图片生成

    验证码图片生成技术是一种常见的安全措施,用于防止自动化程序如机器人或爬虫进行恶意操作,例如在网站注册、登录、发布评论等环节。易语言是一种中国本土开发的编程语言,其特点是语法简单,易于学习,适合初学者...

    ASP.NET图片验证码程序(含调用实例)

    它可能包含一个表单,一个`&lt;img&gt;`标签用于显示验证码图片,一个文本框让用户输入验证码,以及一个提交按钮。 总的来说,这个ASP.NET验证码程序通过结合C#的图像处理能力和随机数生成,创建了一个安全且实用的验证...

    简单的js验证码制作

    通过学习这个简单的JS验证码制作,你可以理解验证码的基本原理,并开始探索更复杂的安全验证机制,例如图片验证码(CAPTCHA)、滑动验证码、点选图片验证码等。同时,这也是学习JavaScript和前端开发的一个好起点,...

    python制作图片验证码

    在这个主题中,我们将深入探讨如何使用Python语言来创建带有噪声的图片验证码。 首先,我们需要了解验证码的基本原理。验证码通常包含随机生成的一串字符,这些字符以图像形式展示,并要求用户输入看到的字符序列。...

    基于PHP制作验证码1

    (1)创建一个名为“yanzhengma.php”的 PHP 文件,用来制作验证码图片。 (2)开启 session,方便传值来验证用户的输入的内容是否正确。 (3)输出图片格式,header('Content-type:image/png'); //输出头信息,...

    Java制作随机验证码

    图片验证码则需要结合图形库,如Java的`java.awt`和`javax.imageio`包,生成一张包含验证码文字的图片,并添加一些扭曲、噪点等干扰元素,增加机器识别的难度。 在项目中,可能还会包含一些额外的功能,比如: 1. ...

    HTML制作图形验证码框那种=文本框+滑块 的效果.zip

    在这个例子中,背景图片被设计成条形,用户需要通过滑动来揭示隐藏的验证码文字。这个条形图片可以是随机生成的数字或字母的组合,确保每次刷新页面时都会改变,增加安全性。 HTML方面,我们可以创建一个`&lt;input&gt;`...

    ASP制作验证码需要的三个文件

    1. **验证码图片生成文件**: 这个文件通常是一个ASP页面,它的主要任务是生成随机的、不可预测的验证码字符串,并将其显示为图像。这个过程涉及以下几个步骤: - 生成随机字符串:字符串可以包含字母、数字,甚至...

    实现基于PHP制作验证码

    基于PHP制作验证码 一、 开发环境 1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime 3。 二、主要技术 本案例主要基于PHP中的GD库来实现验证码的制作。 GD(graphic device...

    制作网站常用--四位彩色验证码

    - **客户端显示**:如何在网页上正确显示验证码图片,并提供刷新验证码的选项。 - **验证过程**:用户输入后,服务器如何验证输入的验证码是否正确,以及错误处理机制。 - **安全注意事项**:如何避免常见的...

    php图片验证码制作教程

    关于php的验证码制作ppt,可做教学用

    动态滑动后端验证码实现

    这些图片可以是随机生成的数字、字母组合,或者是复杂背景下的可识别对象,用于制作验证码图像。 3. **图片处理**: - 在生成验证码时,服务器会从图像库中随机选择一张图片,然后将图片的某一部分遮挡(通常通过...

    图片验证码识别程序、验证码识别引擎DLL组件

    识别程序使用delphi语言编写,以dll的方式提供使用,通过简单的函数调用即可识别复杂的验证码图片。 自动识别各种验证码 自动识别; 智能处理各种背景、边框、干扰等; 识别率可达100%(指不太复杂的验证码);本...

    php压缩图片,添加水印,制作验证码等

    在PHP编程中,处理图像是一项常见的任务,包括压缩图片、添加水印以及制作验证码等。这些功能对于网站的性能优化、品牌保护以及用户安全都至关重要。以下是对这些知识点的详细说明: 1. **PHP 图像处理库**: PHP ...

    VB制作验证码 研究 学习 VB

    在VB(Visual Basic)编程环境下制作验证码,可以帮助开发者学习和理解图形用户界面(GUI)编程、随机数生成、图像处理以及字符串操作等基础知识。下面将详细探讨VB制作验证码涉及的知识点。 1. **图形库和控件**:...

    html5点击刷新验证码特效

    然而,随着技术的发展,验证码的形式也变得越来越多样化,其中包括图片验证码、滑动验证码、点击验证码等。 在HTML5中,我们可以利用Canvas元素来生成和展示验证码。Canvas是HTML5的一个重要特性,它允许开发者在...

    制作验证码(含有源码)

    在这个“制作验证码(含有源码)”的压缩包中,包含了实现各种复杂验证码功能的源代码。下面将详细介绍验证码的原理、类型以及可能涉及的技术。 1. 验证码的原理: 验证码的基本原理是让计算机生成一组随机数据,并...

    验证码图片水印

    验证码制作,包括加点划线,中文验证码,图片剪切,图片水印等 验证码制作,包括加点划线,中文验证码,图片剪切,图片水印等

    验证码识别DLL

    本验证码识别DLL可以识别一些纯数字的验证码,压缩包中的字模库是专门为 http://www.haiguan.info/onlinesearch/gateway/Gatewaystate.aspx这个网站量身订做的

Global site tag (gtag.js) - Google Analytics