java生成验证码图片

/**
 * Copyright (c) 2018, www.wisdombud.com
 * All Rights Reserved.
 */
package com.wisdombud.dth.boss.ui.web.base;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * date: 2018年8月21日 下午4:59:36 <br/>
 *
 * @author zlliu
 */
public class RandomImageUtil {
    private final Logger logger = LoggerFactory.getLogger(RandomImageUtil.class);
    public static final String RANDOM_CODE_KEY= "RANDOMVALIDATECODEKEY";//放到session中的key
    private final String randString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
    private final int width = 60;// 图片宽
    private final int height = 23;// 图片高
    private final int lineSize = 3;// 干扰线数量
    private final int stringNum = 4;// 随机产生字符数量
    private final int minColor = 200;//背景颜色最小值


    private Random random = new Random();

    /**
     * 获得字体
     */
    private Font getFont() {
        return new Font("Viner Hand ITC", Font.ITALIC, 18);
    }
    
    /**
     * 获得背景颜色
     */
    private Color getBgColor() {
        int r = random.nextInt(50) + minColor;
        int g = random.nextInt(50) + minColor;
        int b = random.nextInt(50) + minColor;
        return new Color(r, g, b);
    }

    /**
     * 获得颜色
     */
    private Color getRandColor(int fc, int bc) {
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc - 16);
        int g = fc + random.nextInt(bc - fc - 14);
        int b = fc + random.nextInt(bc - fc - 18);
        return new Color(r, g, b);
    }

    /**
     * 生成随机图片
     */
    public void buildRandcode(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        g.setColor(getBgColor());
        g.fillRect(0, 0, width, height);//图片大小
        // 绘制干扰线
        for (int i = 0; i <= lineSize; i++) {
            g.setColor(getRandColor(110, 200));//字体颜色
            drowLine(g);
        }
        // 绘制随机字符
        StringBuffer randomString = new StringBuffer();
        for (int i = 1; i <= stringNum; i++) {
            drowString(g, randomString, i);
        }
        logger.info(randomString.toString());
        //将生成的随机字符串保存到session中
        session.removeAttribute(RANDOM_CODE_KEY);
        session.setAttribute(RANDOM_CODE_KEY, randomString);
        g.dispose();
        try {
            response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
            response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expire", 0);
            // 将内存中的图片通过流动形式输出到客户端
            ImageIO.write(image, "PNG", response.getOutputStream());
        } catch (Exception e) {
            logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e);
        }

    }

    /**
     * 绘制字符串
     */
    private void drowString(Graphics g, StringBuffer randomString, int i) {
        g.setFont(getFont());
        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                .nextInt(121)));
        String rand = getRandomString(random.nextInt(randString.length()));
        randomString.append(rand);
        //修改画图起始坐标
        g.translate(0, random.nextInt(3));
        int x = i == 1 ? 6 : 10 * i;
        g.drawString(rand, x, 16);
    }

    /**
     * 绘制干扰线
     */
    private void drowLine(Graphics g) {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(30);
        int yl = random.nextInt(30);
        g.drawLine(x, y, x + xl, y + yl);
    }

    /**
     * 获取随机的字符
     */
    public String getRandomString(int num) {
        return String.valueOf(randString.charAt(num));
    }
}
原文地址:https://www.cnblogs.com/qiaoyutao/p/9894958.html