zoukankan      html  css  js  c++  java
  • java实现简单的验证码(待增强)

    package com.xxx;

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import javax.imageio.ImageIO;

    import org.junit.Test;

    public class IdentifyingCode {
        
        private final int WIDTH = 70;
        private final int HEIGHT = 30;
        private final byte[] BACKGROUND_COLOR = new byte[]{127, 127, 127};
        private final String FONT_STYLE = "微软雅黑";
        private final char[] IDETIFYING_CODE = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd'};
        private final int CODE_LENGTH= 4;
        private final int FONT_SIZE = 17;
        
        //生成验证码图
        public BufferedImage createIdentifyingCode(){
            StringBuilder sb = new StringBuilder();
            
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
            //得到画笔
            Graphics2D g =  image.createGraphics();
            //得到之前画笔的颜色
            Color color = g.getColor();
            
            //画图片边框
            this.drawImageCheek(g);
            this.drawCamouflageLine(g, 8);
            //设置背景色
            g.setBackground(new Color(BACKGROUND_COLOR[0]+128, BACKGROUND_COLOR[1]+128, BACKGROUND_COLOR[2]+128));
            //设置字体大小及其样式
            g.setFont(new Font(FONT_STYLE, Font.PLAIN, (int)(this.FONT_SIZE)){
                private static final long serialVersionUID = 1L;});
            
            //将验证字符加入图中
            for(int i=0; i<CODE_LENGTH; i++){
                //设置画笔颜色
                g.setColor(this.randomColor());
                //得到随机字符
                char charCode = IDETIFYING_CODE[this.randomNumber(0, IDETIFYING_CODE.length-1)];
                sb.append(charCode);
                //将字符写到图片中
                System.out.println(sb);
                //g.rotate(this.randomNumber(45, 135));
                g.drawString(""+charCode, WIDTH/5*(i+1)-5, (this.FONT_SIZE)+this.randomNumber(0, this.FONT_SIZE/2));
                
            }
            
            try {
                ImageIO.write(image, "jpeg", new FileOutputStream("D:/11.jpeg"));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return image;
        }
        
        /**
         * 按照随机三原色生成一个颜色
         *
         * @return 颜色
         */
        public Color randomColor(){
            int min = 0;
            int max = 255;
            int red = randomNumber(min, max);
            int green = randomNumber(min, max);
            int yellow = randomNumber(min, max);
            return new Color(red, green, yellow);
        }
        
        public void drawCamouflageLine(Graphics2D g, int quantity){
            Color oldColor = g.getColor();
            for(int i=0; i<quantity; i++){
                g.setColor(this.randomColor());
                g.drawLine(this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT), this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT));
            }
            g.setColor(oldColor);
        }
        
        /**
         * 绘制图片内侧边框
         *
         * @param g 画笔
         */
        public void drawImageCheek(Graphics2D g){
            Color oldColor = g.getColor();
            g.setColor(new Color(255, 255, 255));
            g.drawLine(0, 0, this.WIDTH-2, 0);
            g.drawLine(0, 0, 0, this.HEIGHT-2);
            g.drawLine(0, this.HEIGHT-2, this.WIDTH-2, this.HEIGHT-2);
            g.drawLine(this.WIDTH-2, 0, this.WIDTH-2, this.HEIGHT-2);
            g.setColor(oldColor);
        }
        
        public int randomNumber(int min, int max){
            return (int)((Math.random()*(max-min+1))+min);
            
        }
        
        public static void main(String[] args) {
            new IdentifyingCode().createIdentifyingCode();
        }
    }

    其中待解决的问题:背景没有设置正确

    待优化:验证图中的验证码需要旋转增加程序识别难度

    这是目前的效果

     

    选择一种风格,保持这种风格。
  • 相关阅读:
    【读书笔记】之《把时间当做朋友》
    软件工程——五大模型
    VB中的GetUserName函数
    VB中 vbp vbw frm frx log bas 等扩展名大全
    【机房收费系统】——基本数据设定的理解
    在64位WindowsServer2012R2中安装Oracle10g第二版(10.2.0.4.0)-20160106
    Linux——vi命令详解
    使用Postman测试WebService接口
    npm和yarn的淘宝镜像添加
    yarn配置私有registry
  • 原文地址:https://www.cnblogs.com/chenchen-fei/p/5464389.html
Copyright © 2011-2022 走看看