验证码工具类

来源:互联网 发布:淘宝商城的推广 编辑:程序博客网 时间:2024/05/20 03:42
import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.util.Random;/** * @Description: 验证码工具类 ,可以设置背景大体颜色,验证码长度,图像内容,图像大小等等属性,最终的到一个image 对像 * @author: 007 * @CreateDate:  * @version:  */public class ImageUtil{    /**     * 随机类     */    private Random random = new Random();    /**     * 验证码值     */    private String sRandom = "";    /**     * 验证码长度     */    private int imageLength = 4;    /**     * 随机线数量     */    private int randLineCount = 100;    /**     * 宽度     */    private int width = 60;    /**     * 长度     */    private int height = 25;    /**     * 验证码图像     */    private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);    /**     * 获取图形上下文     */    private Graphics graphics = image.getGraphics();    /**     * 字体类     */    private Font font = new Font("Times New Roman", Font.PLAIN, 18);    /**     * 验证码显示字符库     */    private char[] selectChar = { '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', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',            'Z' };    /**     * 随机线颜色起始值     */    private int lfCloor = 120;    /**     * 随机线颜色结束值     */    private int lbCloor = 130;    /**     *      */    private int fCloor = 195;    /**     *      */    private int bCloor = 205;    /**     * 获得验证码的值大写值     *      * @return     */    public String getsRandom()    {        return sRandom.toUpperCase();    }    /**     * 获取验证码图像公开方法     *      * return 图像     */    public BufferedImage getImage()    {        DrawImage();        return image;    }    /**     * 随机划线     */    private void drawRandomLine()    {        graphics.setColor(getRandColor(lfCloor, lbCloor));        for (int i = 0; i < randLineCount; i++)        {            int x = random.nextInt(width);            int y = random.nextInt(height);            int xl = random.nextInt(12);            int yl = random.nextInt(12);            graphics.drawLine(x, y, x + xl, y + yl);        }    }    /**     * 生成图验证码图像     *      */    private void DrawImage()    {        // 设定背景色        graphics.setColor(getRandColor(fCloor, bCloor));        //换背景图        graphics.fillRect(0, 0, width, height);        //设定字体        graphics.setFont(font);        //生成随机线        drawRandomLine();        //生成随机字符        for (int i = 0; i < imageLength; i++)        {            int charIndex = random.nextInt(selectChar.length);            String rand = "" + selectChar[charIndex];            sRandom += rand;            //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成            graphics.setColor(new Color(20 + random.nextInt(110), 40 + random.nextInt(110), 60 + random.nextInt(110)));            graphics.drawString(rand, 13 * i - (random.nextInt(5) * 2) + 6, 16);        }        graphics.dispose();    }    /**     * 按给定范围产生随机颜色     *      * @param 开始颜色指数     * @param 结束颜色指数     * @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);    }    public void setSelectChar(final char[] selectChar)    {        this.selectChar = selectChar;    }    public void setImageLength(final int imageLength)    {        this.imageLength = imageLength;    }    public void setRandLineCount(final int randLineCount)    {        this.randLineCount = randLineCount;    }    public void setWidth(final int width)    {        this.width = width;    }    public void setHeight(final int height)    {        this.height = height;    }    public void setFont(final Font font)    {        this.font = font;    }    public void setLfCloor(final int lfCloor)    {        this.lfCloor = lfCloor;    }    public void setLbCloor(final int lbCloor)    {        this.lbCloor = lbCloor;    }    public void setfCloor(final int fCloor)    {        this.fCloor = fCloor;    }    public void setbCloor(final int bCloor)    {        this.bCloor = bCloor;    }}