欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java生成二維碼的實(shí)例代碼

 更新時(shí)間:2020年09月09日 10:04:59   作者:崔笑顏  
這篇文章主要介紹了Java生成二維碼的實(shí)例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

使用開(kāi)源的一維/二維碼圖形處理庫(kù)zxing GitHub地址

引入依賴

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
  <groupId>com.google.zxing</groupId>
  <artifactId>core</artifactId>
  <version>3.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
  <groupId>com.google.zxing</groupId>
  <artifactId>javase</artifactId>
  <version>3.3.0</version>
</dependency>

封裝工具類

package com.app.utils;
 
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 
/**
 * @title 生成二維碼工具類
 * @author zch
 * @discribtion
 * @Date 2020年1月3日 下午4:26:05
 * @vision V1.0
 */
public class QRCodeUtil
{
  private static final int width = 200; // 圖像寬度
  
  private static final int height = 200; // 圖像高度
  
  private static final int ON_COLOR = 0xFF000001;
  
  private static final int OFF_COLOR = 0xFFFFFFFF;
  
  /**
   * @title 生成二維碼圖片
   * @discribtion
   * @author zch
   * @Date 2020年1月3日 下午3:27:21
   * @param width 二維碼寬度,默認(rèn)為200
   * @param height 二維碼高度,默認(rèn)為200
   * @param content 二維碼內(nèi)容,必填
   * @param logoPath logo圖片路徑,若為空則生成不帶logo的二維碼
   * @param imgPath 生成二維碼文件夾路徑
   * @param imgName 生成二維碼圖片名稱,必填
   * @param suffix 生成二維碼圖片后綴類型,例如:gif,必填
   * @vision V1.0
   */
  public static boolean generateQRImage(Integer width, Integer height, String content, String logoPath, String imgPath, String imgName, String suffix)
  {
    if (content == null || imgName == null || suffix == null)
    {
      return false;
    }
    try
    {
      width = width == null ? QRCodeUtil.width : width;
      height = height == null ? QRCodeUtil.height : height;
      if (logoPath != null && !"".equals(logoPath.trim()))
      {
        QREncode(width, height, content, logoPath, imgPath, imgName, suffix);
      }
      else
      {
        QREncode(width, height, content, imgPath, imgName, suffix);
      }
      return true;
    }
    catch (Exception e)
    {
      e.printStackTrace();
      return false;
    }
  }
  
  /**
   * @title 生成二維碼
   * @discribtion
   * @author zch
   * @Date 2020年1月3日 下午3:27:21
   * @vision V1.0
   */
  private static void QREncode(int width, int height, String content, String imgPath, String imgName, String suffix)
    throws Exception
  {
    File filePath = new File(imgPath);
    if (!filePath.exists())
    {
      filePath.mkdirs();
    }
    File imageFile = new File(imgPath, imgName);
    Map<EncodeHintType, Object> hints = new HashMap<>();
    // 內(nèi)容編碼格式
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    // 指定糾錯(cuò)等級(jí)
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    // 設(shè)置二維碼邊的空度,非負(fù)數(shù)
    hints.put(EncodeHintType.MARGIN, 1);
    BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    MatrixToImageWriter.writeToPath(bitMatrix, suffix, imageFile.toPath());// 輸出原圖片
  }
  
  /**
   * @title 生成帶logo的二維碼
   * @discribtion
   * @author zch
   * @Date 2020年1月3日 下午3:27:21
   * @vision V1.0
   */
  private static void QREncode(int width, int height, String content, String logoPath, String imgPath, String imgName, String suffix)
    throws Exception
  {
    File filePath = new File(imgPath);
    if (!filePath.exists())
    {
      filePath.mkdirs();
    }
    File imageFile = new File(imgPath, imgName);
    Map<EncodeHintType, Object> hints = new HashMap<>();
    // 內(nèi)容編碼格式
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    // 指定糾錯(cuò)等級(jí)
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    // 設(shè)置二維碼邊的空度,非負(fù)數(shù)
    hints.put(EncodeHintType.MARGIN, 1);
    BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    MatrixToImageConfig matrixToImageConfig = new MatrixToImageConfig(ON_COLOR, OFF_COLOR);
    BufferedImage bufferedImage = LogoMatrix(MatrixToImageWriter.toBufferedImage(bitMatrix, matrixToImageConfig), new File(logoPath));
    ImageIO.write(bufferedImage, suffix, imageFile);// 輸出帶logo圖片
  }
  
  /**
   * @title 二維碼圖片添加logo
   * @discribtion 
   * @author zch
   * @Date 2020年1月3日 下午3:27:21
   * @param matrixImage 源二維碼圖片
   * @param logoFile logo圖片
   * @vision V1.0
   */
  private static BufferedImage LogoMatrix(BufferedImage matrixImage, File logoFile)
    throws IOException
  {
    // 讀取二維碼圖片,并構(gòu)建繪圖對(duì)象
    Graphics2D gs = matrixImage.createGraphics();
    int matrixWidth = matrixImage.getWidth();
    int matrixHeigh = matrixImage.getHeight();
    int ratioWidth = matrixWidth * 2 / 10;
    int ratioHeight = matrixHeigh * 2 / 10;
    // 讀取Logo圖片
    BufferedImage logo = ImageIO.read(logoFile);
    int logoWidth = logo.getWidth(null) > ratioWidth ? ratioWidth : logo.getWidth(null);
    int logoHeight = logo.getHeight(null) > ratioHeight ? ratioHeight : logo.getHeight(null);
    int x = (matrixWidth - logoWidth) / 2;
    int y = (matrixHeigh - logoHeight) / 2;
    
    // 繪制
    gs.drawImage(logo, x, y, logoWidth, logoHeight, null);
    gs.setColor(Color.BLACK);
    gs.setBackground(Color.WHITE);
 
    gs.dispose();
    matrixImage.flush();
    return matrixImage;
  }
}

測(cè)試生成二維碼

QRCodeUtil.generateQRImage(null, null, "https://blog.csdn.net/qq_34928194", null, "E:/", "test.gif", "gif");

以上就是Java生成二維碼的實(shí)例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java生成二維碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中的ThreadPoolExecutor線程池詳解

    Java中的ThreadPoolExecutor線程池詳解

    這篇文章主要介紹了Java中的ThreadPoolExecutor線程池詳解,當(dāng)線程池中的線程數(shù)大于 corePoolSize 時(shí),keepAliveTime 為多余的空閑線程等待新任務(wù)的最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間后多余的線程將被終止,需要的朋友可以參考下
    2023-12-12
  • 一篇文章看懂Java字符串操作

    一篇文章看懂Java字符串操作

    String是Java中的類,它提供一些預(yù)定義的方法,這些方法使基于字符串的問(wèn)題解決方案更加容易,下面這篇文章主要給大家介紹了關(guān)于Java字符串操作的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • SpringBoot整合Lucene實(shí)現(xiàn)全文檢索的詳細(xì)步驟

    SpringBoot整合Lucene實(shí)現(xiàn)全文檢索的詳細(xì)步驟

    全文搜索(Full-Text?Search)是指對(duì)大規(guī)模存儲(chǔ)在計(jì)算機(jī)系統(tǒng)中的文本數(shù)據(jù)進(jìn)行檢索和匹配的技術(shù),它允許用戶輸入關(guān)鍵字,然后從海量的文本數(shù)據(jù)中快速找到相關(guān)的信息,本文介紹了SpringBoot整合Lucene實(shí)現(xiàn)全文檢索的詳細(xì)步驟,需要的朋友可以參考下
    2024-03-03
  • 詳解HandlerInterceptor處理器攔截器的用法

    詳解HandlerInterceptor處理器攔截器的用法

    這篇文章主要介紹了HandlerInterceptor處理器攔截器的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java引用隊(duì)列和虛引用實(shí)例分析

    Java引用隊(duì)列和虛引用實(shí)例分析

    這篇文章主要介紹了Java引用隊(duì)列和虛引用,結(jié)合實(shí)例形式分析了java引用隊(duì)列和虛引用相關(guān)概念、原理與使用方法,需要的朋友可以參考下
    2019-08-08
  • Java單例模式的深入了解

    Java單例模式的深入了解

    這篇文章主要為大家介紹了Java單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 最新評(píng)論