最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java生成驗(yàn)證碼圖片的方法

 更新時(shí)間:2021年02月25日 10:27:21   作者:相思子~  
這篇文章主要為大家詳細(xì)介紹了java生成驗(yàn)證碼圖片的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java生成驗(yàn)證碼圖片的具體代碼,供大家參考,具體內(nèi)容如下

示例一:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Random;



public class RandomVerifyCode {

  private static final String RANDOM_NUM = "23456789";
  private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ";
  private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz";
  private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL;

  private int width = 95;// 圖片寬
  private int height = 25;// 圖片高
  private int lineSize = 40;// 干擾線數(shù)量
  private int stringNum = 4;// 隨機(jī)產(chǎn)生字符數(shù)量

  private Random random = new Random();


  /**
   * 獲得字體
   */
  private Font getFont() {
    return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
  }

  /**
   * 獲得顏色
   */
  private Color getRandColor(int fc, int bc) {
    if (fc > 255)
      fc = 255;
    if (bc > 255)
      bc = 255;
    int r = fc + random.nextInt(bc - fc - 16);
    int g = fc + random.nextInt(bc - fc - 14);
    int b = fc + random.nextInt(bc - fc - 18);
    return new Color(r, g, b);
  }

  /**
   * 生成隨機(jī)圖片(BASE64格式)
   */
  public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {
    // BufferedImage類是具有緩沖區(qū)的Image類,Image類是用于描述圖像信息的類
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    Graphics g = image.getGraphics();// 產(chǎn)生Image對(duì)象的Graphics對(duì)象,改對(duì)象可以在圖像上進(jìn)行各種繪制操作
    g.fillRect(0, 0, width, height);//圖片大小
    g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字體大小
    g.setColor(getRandColor(110, 133));//字體顏色
    // 繪制干擾線
    for (int i = 0; i <= lineSize; i++) {
      drowLine(g);
    }
    // 繪制隨機(jī)字符
    String randomString = "";
    for (int i = 1; i <= stringNum; i++) {
      randomString = drowString(g, randomString, i);
    }
    g.dispose();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    String encode = null;
    try {
      // 將內(nèi)存中的圖片通過流動(dòng)形式輸出到客戶端
      ImageIO.write(image, "JPEG", out);
      encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());
      out.close();
    } catch (Exception e) {
      LogHelper.error("登陸控制","驗(yàn)證碼生成","將內(nèi)存中生成的驗(yàn)證碼圖片輸出為BASE64格式編碼失??!");
    }
    imgBuffer.append(encode);
    return randomString;
  }


  /**
   * 繪制字符串
   */
  private String drowString(Graphics g, String randomString, int i) {
    g.setFont(getFont());
    g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
        .nextInt(121)));
    String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));
    randomString += rand;
    g.translate(random.nextInt(3), random.nextInt(3));
    g.drawString(rand, 13 * i, 16);
    return randomString;
  }

  /**
   * 繪制干擾線
   */
  private void drowLine(Graphics g) {
    int x = random.nextInt(width);
    int y = random.nextInt(height);
    int xl = random.nextInt(13);
    int yl = random.nextInt(15);
    g.drawLine(x, y, x + xl, y + yl);
  }

  /**
   * 獲取隨機(jī)的字符
   */
  public String getRandomString(int num) {
    return String.valueOf(RANDOM_STRING.charAt(num));
  }



  public static String randomString(int length){
    return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());
  }
}

示例二:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class CodeUtil {

  private static int width = 90;// 定義圖片的width 90
  private static int height = 20;// 定義圖片的height 20
  private static int codeCount = 4;// 定義圖片上顯示驗(yàn)證碼的個(gè)數(shù)
  private static int xx = 15;
  private static int fontHeight = 18;
  private static int codeY = 16;
  private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
      'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};

  public static Map<String,RenderedImage> codePicMap = new HashMap<>();

  /**
   * 生成一個(gè)map集合
   * code為生成的驗(yàn)證碼
   * codePic為生成的驗(yàn)證碼BufferedImage對(duì)象
   *
   * @return
   */
  public static Map<String, Object> generateCodeAndPic() {
    // 定義圖像buffer
    BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // Graphics2D gd = buffImg.createGraphics();
    // Graphics2D gd = (Graphics2D) buffImg.getGraphics();
    Graphics gd = buffImg.getGraphics();
    // 創(chuàng)建一個(gè)隨機(jī)數(shù)生成器類
    Random random = new Random();
    // 將圖像填充為藍(lán)色
//    gd.setColor(Color.WHITE);
    gd.setColor(new Color(232,240,254));
    gd.fillRect(0, 0, width, height);

    // 創(chuàng)建字體,字體的大小應(yīng)該根據(jù)圖片的高度來定。
    Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
    // 設(shè)置字體。
    gd.setFont(font);

    // 畫邊框。
    gd.setColor(Color.BLACK);
    gd.drawRect(0, 0, width - 1, height - 1);

    // 隨機(jī)產(chǎn)生40條干擾線,使圖象中的認(rèn)證碼不易被其它程序探測到。
    gd.setColor(Color.BLACK);
    for (int i = 0; i < 10; i++) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(12);
      int yl = random.nextInt(12);
      gd.drawLine(x, y, x + xl, y + yl);
    }

    // randomCode用于保存隨機(jī)產(chǎn)生的驗(yàn)證碼,以便用戶登錄后進(jìn)行驗(yàn)證。
    StringBuffer randomCode = new StringBuffer();
    int red = 0, green = 0, blue = 0;

    // 隨機(jī)產(chǎn)生codeCount數(shù)字的驗(yàn)證碼。
    for (int i = 0; i < codeCount; i++) {
      // 得到隨機(jī)產(chǎn)生的驗(yàn)證碼數(shù)字。
      String code = String.valueOf(codeSequence[random.nextInt(31)]);
      // 產(chǎn)生隨機(jī)的顏色分量來構(gòu)造顏色值,這樣輸出的每位數(shù)字的顏色值都將不同。
      red = random.nextInt(255);
      green = random.nextInt(255);
      blue = random.nextInt(255);

      // 用隨機(jī)產(chǎn)生的顏色將驗(yàn)證碼繪制到圖像中。
      gd.setColor(new Color(red, green, blue));
      gd.drawString(code, (i + 1) * xx, codeY);
      // 將產(chǎn)生的四個(gè)隨機(jī)數(shù)組合在一起。
      randomCode.append(code);
    }
    Map<String, Object> map = new HashMap<>();
    //存放驗(yàn)證碼
    map.put("code", randomCode);
    //存放生成的驗(yàn)證碼BufferedImage對(duì)象
    map.put("codePic", buffImg);
    return map;
  }


  public static void main(String[] args) throws Exception {
    //創(chuàng)建文件輸出流對(duì)象
    OutputStream out = new FileOutputStream("D://img/" + System.currentTimeMillis() + ".jpg");
    Map<String, Object> map = CodeUtil.generateCodeAndPic();
    ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);
    System.out.println("驗(yàn)證碼的值為:" + map.get("code"));
  }
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用MapStruct進(jìn)行Java Bean映射的方式

    使用MapStruct進(jìn)行Java Bean映射的方式

    MapStruct是一個(gè)用于JavaBean映射的注解處理器,它通過注解生成類型安全且性能優(yōu)異的映射代碼,避免手動(dòng)編寫重復(fù)的樣板代碼,主要特性包括類型安全、高性能、簡潔和可定制性,使用步驟包括定義映射接口、創(chuàng)建源類和目標(biāo)類、生成映射代碼并調(diào)用映射方法
    2025-02-02
  • Maven插件之Dependency:analyze的使用

    Maven插件之Dependency:analyze的使用

    在軟件開發(fā)中,合理管理項(xiàng)目依賴是保證構(gòu)建穩(wěn)定性的關(guān)鍵,Maven作為流行的項(xiàng)目管理工具,提供了Dependency插件來幫助開發(fā)者分析和優(yōu)化項(xiàng)目依賴,通過執(zhí)行dependency:analyze指令,可以辨識(shí)項(xiàng)目中使用的、未聲明的、和未使用的依賴項(xiàng)
    2024-10-10
  • 基于Java實(shí)現(xiàn)五子棋小游戲(附源碼)

    基于Java實(shí)現(xiàn)五子棋小游戲(附源碼)

    這篇文章主要為大家介紹了如何通過Java實(shí)現(xiàn)簡單的五子棋游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java游戲開發(fā)有一定幫助,需要的可以參考一下
    2022-11-11
  • SpringBoot3整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例

    SpringBoot3整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)的示例

    Quartz 是一個(gè)開源的任務(wù)調(diào)度框架,用于在應(yīng)用程序中創(chuàng)建、管理和調(diào)度定時(shí)任務(wù),將 Quartz 和 Spring Boot 3 結(jié)合,可以輕松實(shí)現(xiàn)定時(shí)任務(wù)的靈活管理,本文將詳細(xì)介紹如何在 Spring Boot 3 項(xiàng)目中集成 Quartz Scheduler 并實(shí)現(xiàn)示例任務(wù)的調(diào)度,需要的朋友可以參考下
    2024-11-11
  • Java實(shí)現(xiàn)微信小程序加密數(shù)據(jù)解密算法

    Java實(shí)現(xiàn)微信小程序加密數(shù)據(jù)解密算法

    我們開發(fā)微信小程序的過程中,我們的服務(wù)端有時(shí)需要獲取微信提供的開放數(shù)據(jù)。微信會(huì)對(duì)這些開放數(shù)據(jù)做簽名和加密處理,本文通過實(shí)例代碼給大家介紹Java實(shí)現(xiàn)微信小程序加密數(shù)據(jù)解密算法,感興趣的朋友一起看看吧
    2021-11-11
  • 詳解Java中數(shù)組判斷元素存在幾種方式比較

    詳解Java中數(shù)組判斷元素存在幾種方式比較

    這篇文章主要介紹了Java中數(shù)組判斷元素存在幾種方式比較,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • Java?+?Selenium?+?OpenCV解決自動(dòng)化測試中的滑塊驗(yàn)證問題

    Java?+?Selenium?+?OpenCV解決自動(dòng)化測試中的滑塊驗(yàn)證問題

    OpenCV是一個(gè)基于Apache2.0許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,可以運(yùn)行在Linux、Windows、Android和Mac?OS操作系統(tǒng)上,這篇文章主要介紹了Java?+?Selenium?+?OpenCV解決自動(dòng)化測試中的滑塊驗(yàn)證,需要的朋友可以參考下
    2022-07-07
  • 深入理解Java中HashCode方法

    深入理解Java中HashCode方法

    這篇文章主要介紹了深入理解Java中HashCode方法,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過程

    spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過程

    Spring Cloud 是一套基于 Spring Boot 的框架集合,用于構(gòu)建分布式微服務(wù)架構(gòu),文章介紹了Spring Cloud框架及其相關(guān)工具的使用,還詳細(xì)介紹了如何配置和使用這些功能,包括配置文件、依賴管理以及實(shí)際應(yīng)用示例,感興趣的朋友一起看看吧
    2024-11-11
  • Java開發(fā)中為什么要使用單例模式詳解

    Java開發(fā)中為什么要使用單例模式詳解

    單例對(duì)于大家來說并不陌生,但是在什么時(shí)候用單例呢?為什么要用呢?本文就帶大家了解一下為什么要使用單例,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

亳州市| 长春市| 曲阳县| 江口县| 屏东市| 荃湾区| 贵阳市| 阳信县| 慈溪市| 西乡县| 荔浦县| 武强县| 田阳县| 松阳县| 北流市| 沁水县| 汶上县| 油尖旺区| 环江| 崇文区| 桂平市| 铁岭市| 东阳市| 周至县| 望城县| 来宾市| 陆良县| 孝义市| 兰坪| 大石桥市| 澎湖县| 木里| 普陀区| 中阳县| 海门市| 宜都市| 赫章县| 迁安市| 海阳市| 平谷区| 三明市|