zoukankan      html  css  js  c++  java
  • java生成验证码

    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.http.HttpServletResponse;
    
    public class RandImgCreater {
        //默认字符列表
        private static final String CODE_LIST = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
        //验证码图片高度
        private static final int HEIGHT = 20;
        //默认字符数
        private static final int FONT_NUM = 4;
        //生成验证码图片存放位置
        private HttpServletResponse response;
        //宽度
        private int width = 0;
        //实际字符个数
        private int iNum = 0;
        //实际字符列表
        private String codeList = "";
        //绘制背景
        private boolean drawBgFlag = false;
        //R
        private int rBg = 0;
        //G
        private int gBg = 0;
        //B
        private int bBg = 0;
    
        //构造函数(自定义存放位置)
        public RandImgCreater(HttpServletResponse response) {
            this.response = response;
            this.width = 13 * FONT_NUM + 12;
            this.iNum = FONT_NUM;
            this.codeList = CODE_LIST;
        }
        //构造函数(自定义存放位置,字符数)
        public RandImgCreater(HttpServletResponse response,int iNum) {
            this.response = response;
            this.width = 13 * iNum + 12;
            this.iNum = iNum;
            this.codeList = CODE_LIST;
        }
        
        //构造函数(自定义存放位置,字符数,字符列表)
        public RandImgCreater(HttpServletResponse response, int iNum,
                String codeList) {
            this.response = response;
            this.width = 13 * iNum + 12;
            this.iNum = iNum;
            this.codeList = codeList;
        }
    
        //绘制验证码
        public String createRandImage() {
            //1.生成BufferedImage对象,存放图片
            BufferedImage image = new BufferedImage(width, HEIGHT,
                    BufferedImage.TYPE_INT_RGB);
    
            //2.获得BufferedImage对象的画笔
            Graphics g = image.getGraphics();
            
            //生成随机数生成器
            Random random = new Random();
    
            //开始绘制背景
            if (drawBgFlag) { 
                //设置画笔颜色
                g.setColor(new Color(rBg, gBg, bBg));
                //绘制矩形
                g.fillRect(0, 0, width, HEIGHT);
            } else {
                //设置画笔颜色(随机)
                g.setColor(getRandColor(200, 250));
                //绘制矩形
                g.fillRect(0, 0, width, HEIGHT);
                //循环155次生成随机干扰线条
                for (int i = 0; i < 155; i++) {
    //                设置颜色
                    g.setColor(getRandColor(140, 200));
                    //起始位置x
                    int x = random.nextInt(width);
                    //起始位置y
                    int y = random.nextInt(HEIGHT);
                    //结束位置x1
                    int xl = random.nextInt(12);
                    //结束位置y1
                    int yl = random.nextInt(12);
                    //绘制线条
                    g.drawLine(x, y, x + xl, y + yl);
                }
            }
            //设置画笔字体、样式、大小
            g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            
            //要返回的字符串
            String sRand = "";
            //循环内随机生成字符
            for (int i = 0; i < iNum; i++) {
                //随机生成字符起始位置
                int rand = random.nextInt(codeList.length());
                //从字符起始位置截取1位字符
                String strRand = codeList.substring(rand, rand + 1);
                //把新生成的字符与旧字符连接(返回用)
                sRand += strRand;
                //设置前景色(字体颜色)
                g.setColor(new Color(20 + random.nextInt(110), 20 + random
                        .nextInt(110), 20 + random.nextInt(110)));
                //绘制字符,第一个字符从0位置开始,每个字符相隔13像素
                g.drawString(strRand, 13 * i + 6, 16);
            }
            //释放资源
            g.dispose();
            try {
                //把图片输出到相应位置
                ImageIO.write(image, "JPEG", response.getOutputStream());
            } catch (IOException e) {
    
            }
            //返回验证码的字符
            return sRand;
        }
    
        //设置背景色(R,G,B颜色)
        public void setBgColor(int r, int g, int b) {
            drawBgFlag = true;
            this.rBg = r;
            this.gBg = g;
            this.bBg = b;
        }
    
        //随机生成颜色
        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);
        }
    }

    效果:

    生成验证码

    http://yuncode.net/code/c_5222e29542bff63

  • 相关阅读:
    hash表及带注释插头dp
    NOIP模拟测试9「随·单·题」
    静态点分治总结
    NOIP模拟测试8「匹配·回家」
    NOIP模拟测试8「寿司」
    「PKUWC2018」Slay the Spire
    矩阵快速幂总结
    SQL中的object_id函数
    SQL数据库Replace的用法
    SQL批量提交修改业务
  • 原文地址:https://www.cnblogs.com/549294286/p/3439030.html
Copyright © 2011-2022 走看看