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

java生成驗證碼圖片的方法

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

本文實例為大家分享了java生成驗證碼圖片的具體代碼,供大家參考,具體內(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;// 隨機產(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);
  }

  /**
   * 生成隨機圖片(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對象的Graphics對象,改對象可以在圖像上進行各種繪制操作
    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);
    }
    // 繪制隨機字符
    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)存中的圖片通過流動形式輸出到客戶端
      ImageIO.write(image, "JPEG", out);
      encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());
      out.close();
    } catch (Exception e) {
      LogHelper.error("登陸控制","驗證碼生成","將內(nèi)存中生成的驗證碼圖片輸出為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);
  }

  /**
   * 獲取隨機的字符
   */
  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;// 定義圖片上顯示驗證碼的個數(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<>();

  /**
   * 生成一個map集合
   * code為生成的驗證碼
   * codePic為生成的驗證碼BufferedImage對象
   *
   * @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)建一個隨機數(shù)生成器類
    Random random = new Random();
    // 將圖像填充為藍色
//    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);

    // 隨機產(chǎn)生40條干擾線,使圖象中的認證碼不易被其它程序探測到。
    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用于保存隨機產(chǎn)生的驗證碼,以便用戶登錄后進行驗證。
    StringBuffer randomCode = new StringBuffer();
    int red = 0, green = 0, blue = 0;

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

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


  public static void main(String[] args) throws Exception {
    //創(chuàng)建文件輸出流對象
    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("驗證碼的值為:" + map.get("code"));
  }
}

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

相關(guān)文章

  • 使用MapStruct進行Java Bean映射的方式

    使用MapStruct進行Java Bean映射的方式

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

    Maven插件之Dependency:analyze的使用

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

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

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

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

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

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

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

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

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

    Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證問題

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

    深入理解Java中HashCode方法

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

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

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

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

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

最新評論

永安市| 太谷县| 于田县| 梨树县| 皮山县| 利津县| 武夷山市| 宝应县| 延边| 志丹县| 东乌珠穆沁旗| 蚌埠市| 子洲县| 宁国市| 麻江县| 武宁县| 松溪县| 新河县| 乐安县| 双城市| 永平县| 昌吉市| 宜良县| 云龙县| 山西省| 镇远县| 禹城市| 岢岚县| 浠水县| 滦南县| 连城县| 西和县| 南部县| 泰兴市| 民县| 公安县| 石门县| 嘉鱼县| 廊坊市| 泸溪县| 新兴县|