zoukankan      html  css  js  c++  java
  • java创建图片验证码

    package com;

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;

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


    public class ImgServlet extends HttpServlet {

     /**
      *
      */
     private static final long serialVersionUID = 1L;

     private static Random random = new Random();
     private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色
         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 goRegister(HttpServletRequest request, HttpServletResponse response) {
            // 设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);

            // 在内存中创建图象
            int width=100, height=40; // 图象大小
            BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 获取图形上下文
            Graphics2D g=image.createGraphics();
            g.setColor(new Color(255, 255, 255)); // 设定背景色
            g.fillRect(0, 0, width, height);
            g.setFont(new Font("Times New Roman", Font.BOLD, 30)); // 设定字体
            Color c = getRandColor(160, 200);
            // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
            g.setColor(c);
            for(int i=0; i < 155; i++) {
                int x=random.nextInt(width);
                int y=random.nextInt(height);
                int xl=random.nextInt(12);
                int yl=random.nextInt(12);
                g.drawLine(x, y, x + xl, y + yl);
            }
            // 添加噪点 
            float yawpRate = 0.05f;// 噪声率 
            int area = (int) (yawpRate * width * height); 
            for (int i = 0; i < area; i++) { 
                int x = random.nextInt(width); 
                int y = random.nextInt(height); 
                int rgb = getRandomIntColor(); 
                image.setRGB(x, y, rgb); 
            } 
          //随机生成不同的字体、字体样式和字体大小
            String[] fontName = {"微软雅黑","黑体","Georgia","Verdana","Arial","Comic Sans MS","Lucida Console"};
            int [] fontEffect = {Font.PLAIN, Font.ITALIC, Font.BOLD};
            int [] fontSize = {28, 30, 32, 26};
            Font[] fonts = new Font[fontName.length*fontEffect.length*fontSize.length];
            int fontsIndex=0;
            for(String str: fontName){
                for(int effect: fontEffect){
                    for(int size : fontSize){
                        Font font = new Font(str, effect, size);
                        fonts[fontsIndex]=font;
                        fontsIndex = fontsIndex +1;
                    }
                }
            }
            String s="abcdefghijknpqrstuvxyzABCDEFGHJKLNPQRSTUVXYZ23456789"; // 设置备选验证码
            String sRand="";
                  // 用随机产生的颜色将验证码绘制到图像中。
            int length = 4;  // 设置默认生成4个验证码
            for(int i=0;i<length;i++){
            g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110))); // 生成随机颜色(因为是做前景,所以偏深)
                g.setFont(fonts[random.nextInt(fonts.length)]);  //调用上方的随机字体
             String ch=String.valueOf(s.charAt(random.nextInt(s.length())));

          //设置字体旋转
             int zhuan = random.nextInt(20);
             int fzhuan = -random.nextInt(20);
                g.rotate(Math.toRadians(zhuan),25*(i-1),20);     /// 坐标系顺时针转
                g.rotate(Math.toRadians(fzhuan),25*(i-1),20);    /// 坐标系逆时针转
           
                sRand+=ch;
               g.drawString(ch, 18 * i + 15, 30); //将认证码用 drawString 函数显示到图象里

             g.rotate(Math.toRadians(-1*zhuan),25*(i-1),20);
             g.rotate(Math.toRadians(-1*fzhuan),25*(i-1),20);
            }
            //在认证码的上端画一条不规则的线
            int visit[] = new int[6]; 
            for (int i = 0; i < visit.length; i++) { 
                visit[i] = 1 + (int) (Math.random() * 10); 
            }
            g.setColor(Color.BLACK); 
            int drawHigh[] = new int[6]; 
            int drawwidth[] = new int[6]; 
            //折点坐标 
            for (int i = 0; i < 6; i++) { 
               drawHigh[i] = 40 - (int) (Math.ceil(visit[i] * 3.8)); 
               drawwidth[i] = 5 + i * 17; 
            } 
            g.setStroke(new BasicStroke(3.0f));  //折线粗细
            g.setPaint(Color.gray);//折线的颜色
            g.drawPolyline(drawwidth, drawHigh, 6);  //画折线
            // 将认证码存入Session
            HttpSession session = request.getSession(true);
            String time=String.valueOf(System.currentTimeMillis());
            String value=time + "_" + sRand;
            session.setAttribute("", time);
            session.setAttribute("",value);

            // 图象生效
            g.dispose();
            try {
                ImageIO.write(image, "JPEG", response.getOutputStream()); // 输出图象到页面
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        private static int getRandomIntColor() { 
            int[] rgb = getRandomRgb(); 
            int color = 0; 
            for (int c : rgb) { 
                color = color << 8; 
                color = color | c; 
            } 
            return color; 
        } 
        private static int[] getRandomRgb() { 
            int[] rgb = new int[3];
            Random random = new Random();
            for (int i = 0; i < 3; i++) { 
                rgb[i] = random.nextInt(255); 
            } 
            return rgb; 
        } 
    }

  • 相关阅读:
    小端大端
    位域
    c++ 2.1 编译器何时创建默认构造函数
    python 内置&&递归
    python返回值与局部全局变量
    python file
    python set
    python 字典的函数
    python FileError
    python pickle
  • 原文地址:https://www.cnblogs.com/xiaofengyuan/p/5756290.html
Copyright © 2011-2022 走看看