首页 > 编程学习 > 使用Java API绘制验证码图片
20179 月15

使用Java API绘制验证码图片

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 生成验证码,将验证码绘制成一张图片返回浏览器
 * 
 * @author FreeDroid
 *
 */
public class CheckcodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request, 
              HttpServletResponse response) throws 
                     ServletException, IOException {
        /*
         * step1.绘图
         */
        Random r = new Random();
        //从getString()方法取出A-Z,0-9的指定长度随机字符串
        String number = getString(5);
        //先创建一个画布(内存映像对象)
        BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_BGR);
        //获得画笔
        Graphics g = image.getGraphics();
        //给画笔设置颜色
        g.setColor(new Color(255, 255, 255));
        //给画布设置背景颜色
        g.fillRect(0, 0, 80, 30);
        //设置字体
        g.setFont(new Font(null, Font.BOLD|Font.ITALIC, 20));
        //给每个字符设置随机颜色,并画到画布上
        for (int i = 0; i < number.length(); i++) {
            //给画笔设置颜色
            g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
            //在画布上画字符
            g.drawString(String.valueOf(number.charAt(i)), i*15, 25);
        }
        //加一些干扰线
        for (int i = 0; i < 8; i++) {
            //给画笔设置颜色
            g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
            //在画布范围内画线
            g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r.nextInt(30));
        }

        /*
         * step2.将图片压缩,然后输出
         */
        //设置响应内容类型为JPEG格式的图片
        response.setContentType("image/jpeg");
        //获得字节输出流(图片是二进制数据)
        OutputStream os = response.getOutputStream();
        //将原始图片(image)按照指定的算法压缩(jpeg)
                //然后将压缩之后得到的字节写入response对象。
        javax.imageio.ImageIO.write(image, "jpeg", os);
        os.close();     
    }

    /**
     * 随机生成指定长度的大写字母和数字组合
     * @param length
     * @return
     */
    private String getString(int length) {
        StringBuilder str = new StringBuilder();
        Random r = new Random();
        //取出大写字母
        for (int i = 0; i < 26; i++) {
            str.append((char) ('A' + i));
        }
        //取出数字
        for (int i = 0; i < 10; i++) {
            str.append((char) ('0' + i));
        }
        //从字符串str随机取length个字符放进str2组成新的字符串
        StringBuilder str2 = new StringBuilder();
        for (int i = 0; i < length; i++) {
            str2.append(str.charAt(r.nextInt(str.length())));
        }
        return str2.toString();
    }

}

本文地址:https://wizzer.cn/archives/3369 , 转载请保留.

本文目前尚无任何评论.

发表评论