動態(tài)生成圖片驗證碼

動態(tài)生成圖片驗證碼

參數(shù)設置:

可選配置

  1. 圖片的寬度(width)
  2. 圖片高度(height)
  3. 圖片背景顏色(bgColor)
  4. 驗證碼個數(shù)(textSize)

默認值:

width:70
height:35
bgColor:white
textSize:4

使用方式:

DynamicGenerateImageUtil imageUtil = new DynamicGenerateImageUtil.Builder().build();
// outputFilePath 文件輸出路徑
imageUtil.output(new FileOutputStream(new File(outputFilePath)));

package com.hzy.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

/**
 * 動態(tài)生成圖片驗證碼
 */
public final class DynamicGenerateImageUtil {
    /**
     * 圖片寬度
     */
    private static int w = 70;
    /**
     * 圖片高度
     */
    private static int h = 35;
    /**
     * 隨機源
     */
    private static Random r = new Random();
    /**
     * 可選字體
     */
    private static String[] fontNames = {"宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312"};
    /**
     * 可選字符
     */
    private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNOPQRSTUVWXYZ";
    /**
     * 背景色
     */
    private static Color bgColor = new Color(255, 255, 255);
    /**
     * 驗證碼上的文本
     */
    private static String text;

    /**
     * 驗證碼的個數(shù)
     */
    private static int textSize = 4;

    public DynamicGenerateImageUtil(Builder builder) {
        w = builder.width > 0 ? builder.width : w;
        h = builder.height > 0 ? builder.height : h;
        bgColor = builder.bgColor;
        textSize = builder.textSize;
    }

    public static class Builder {
        private int textSize;
        private int width;
        private int height;
        private Color bgColor;

        public Builder textSize(int codeSize) {
            this.textSize = codeSize;
            return this;
        }

        public Builder width(int width) {
            this.width = width;
            return this;
        }

        public Builder height(int height) {
            this.height = height;
            return this;
        }

        public Builder bgColor(Color bgColor) {
            this.bgColor = bgColor;
            return this;
        }

        public DynamicGenerateImageUtil build() {
            return new DynamicGenerateImageUtil(this);
        }
    }

    /**
     * 生成隨機的顏色
     *
     * @return
     */
    private static Color randomColor() {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }

    /**
     * 生成隨機的字體
     *
     * @return
     */
    private static Font randomFont() {
        int index = r.nextInt(fontNames.length);
        //生成隨機的字體名稱
        String fontName = fontNames[index];
        //生成隨機的樣式:0,無樣式。1,粗體。2,斜體。3,粗體+斜體
        int style = r.nextInt(4);
        //生成隨機字號,24-28
        int size = r.nextInt(4) + 24;
        return new Font(fontName, style, size);
    }

    private static void drawLine(BufferedImage image) {
        //一共畫三條
        int num = 3;
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        //生成兩個點的坐標.即4個點的值。
        for (int x = 0; x < num; x++) {
            int x1 = r.nextInt(w);
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h);
            g2.setStroke(new BasicStroke(1.5F));
            //干擾線是藍色
            g2.setColor(Color.BLUE);
            g2.drawLine(x1, y1, x2, y2);
        }
    }

    /**
     * 隨機生成一個字符
     *
     * @return
     */
    private static char randomChar() {
        int index = r.nextInt(codes.length());
        return codes.charAt(index);
    }

    /**
     * 創(chuàng)建BufferedImage
     *
     * @return
     */
    private static BufferedImage createImage() {
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        g2.setColor(bgColor);
        g2.fillRect(0, 0, w, h);
        return image;
    }

    /**
     * 對外提供獲取驗證碼的方法
     */
    private static BufferedImage getImage() {
        //創(chuàng)建圖片緩沖區(qū)
        BufferedImage image = createImage();
        //得到繪制環(huán)境
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        //用來裝載生成的驗證碼文本
        StringBuilder sb = new StringBuilder();
        //循環(huán)codeSize次,每次生成一個字符
        for (int x = 0; x < textSize; x++) {
            //隨機生成一個字母
            String s = randomChar() + "";
            //把字母添加到sb中
            sb.append(s);
            //設置當前字符的x軸坐標
            float f = x * 1.0F * w / textSize;
            //設置隨機字體
            g2.setFont(randomFont());
            //設置隨機顏色
            g2.setColor(randomColor());
            //畫圖
            g2.drawString(s, f, h - 5);
        }
        //把生成的字符串賦給this.text
        text = sb.toString();
        //添加干擾線
        drawLine(image);
        return image;
    }

    /**
     * 返回驗證碼圖片上的文本
     *
     * @return
     */
    public String getText() {
        return text;
    }

    /**
     * 保存圖片到指定的數(shù)出流
     */
    public void output(OutputStream out) throws IOException {
        ImageIO.write(getImage(), "JPEG", out);
    }
}


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 背景 驗證碼就是把一串隨機產品的數(shù)字動態(tài)生成一幅圖片,再加上干擾元素。此時用戶可以通過肉眼能識別里面的數(shù)字或者字符...
    dy2903閱讀 2,346評論 0 7
  • 經過對django的初步學習,我們已經對后臺的基本流程以及django的運作有了一定的了解,但是這還不足夠,dja...
    coder_ben閱讀 3,955評論 8 34
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 28,801評論 1 45
  • 目的:jumpserver 3.0登錄頁面加入驗證碼。 網上有第三方包Django Simple Captcha可...
    LEUNGJH閱讀 1,461評論 0 0
  • 嗨嘍!好朋友,想我了嗎?可我想你了! 今天的任務是第十章考試和第十一章追捕。 我在認真讀給媽媽聽,不要吵到我了! ...
    汪欣怡閱讀 489評論 0 0

友情鏈接更多精彩內容