1. 程式人生 > >zxing框架生成二維碼

zxing框架生成二維碼

1.1 實現思路

  1. 在idea中搭建web專案
  2. 配置依賴jar包
  3. 定義控制器類
  4. 使用zxing核心api生成二維碼

1.2  開發步驟

1.2.1 配置依賴jar

<!-- 配置二維碼生成的框架 -->

<dependency>

    <groupId>com.google.zxing</groupId>

    <artifactId>javase</artifactId

>

    <version>3.1.0</version>

</dependency>

1.2.2開發BarCodeController控制器

@Controller

public class BarCodeController {

  

   /** 定義二維碼圖片的寬度 */

   private static final int WIDTH = 250;

   /** 定義二維碼圖片的高度

*/

   private static final int HEIGHT = 250;

  

   /** 定義LOGO圖片的寬度 */

   private static final int LOGO_WIDTH = 80;

   /** 定義LOGO圖片的高度 */

   private static final int LOGO_HEIGHT = 80;

  

   /** 生成二維碼的方法 */

   @GetMapping

("/barcode")

   public void execute(@RequestParam(value="url", required=false)String url,

            HttpServletResponse response) throws Exception{

      /** 判斷二維碼中URL */

      if (url == null || "".equals(url)){

         url = "http://www.jd.com";

      }

     

      /** 定義Map集合封裝二維碼配置資訊 */

      Map<EncodeHintType, Object> hints = new HashMap<>();

      /** 設定二維碼圖片的內容編碼 */

      hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

      /** 設定二維碼圖片的上、下、左、右間隙 */

      hints.put(EncodeHintType.MARGIN, 1);

      /** 設定二維碼的糾錯級別 */

      hints.put(EncodeHintType.ERROR_CORRECTION,

ErrorCorrectionLevel.H);

      /**

       * 建立二維碼位元組轉換物件

       * 第一個引數:二維碼圖片中的內容

       * 第二個引數:二維碼格式器

       * 第三個引數:生成二維碼圖片的寬度

       * 第四個引數:生成二維碼圖片的高度

       * 第五個引數:生成二維碼需要配置資訊

       *  */

      BitMatrix matrix = new

MultiFormatWriter().encode(url,

            BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);

     

      /** 獲取二維碼圖片真正的寬度  */

      int matrix_width = matrix.getWidth();

      /** 獲取二維碼圖片真正的高度  */

      int matrix_height = matrix.getHeight();

      /** 定義一張空白的緩衝流圖片 */

      BufferedImage image = new

BufferedImage(matrix_width, matrix_height,

               BufferedImage.TYPE_INT_RGB);

      /** 把二維碼位元組轉換物件 轉化 到緩衝流圖片上 */

      for (int x = 0; x < matrix_width; x++){

         for (int y = 0; y < matrix_height; y++){

            /** 通過xy座標獲取一點的顏色 true: 黑色  false: 白色 */

            int rgb = matrix.get(x, y) ? 0xFF1493 : 0xFFFFFF;

            image.setRGB(x, y, rgb);

         }

      }

     

      /** 獲取公司logo圖片 */

      BufferedImage logo = ImageIO.read(new File(

this.getClass().getResource("/17.jpg").getPath()));

      /** 獲取緩衝流圖片的畫筆 */

      Graphics2D g = (Graphics2D)image.getGraphics();

      /** 在二維碼圖片中間繪製公司logo */

      g.drawImage(logo, (matrix_width - LOGO_WIDTH) / 2,

                    (matrix_height - LOGO_HEIGHT) / 2,

             LOGO_WIDTH, LOGO_HEIGHT, null);

     

      /** 設定畫筆的顏色 */

      g.setColor(Color.WHITE);

      /** 設定畫筆的粗細 */

      g.setStroke(new BasicStroke(5.0f));

      /** 設定消除鋸齒 */

      g.setRenderingHint(RenderingHints

.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

      /** 繪製圓角矩形 */

      g.drawRoundRect((matrix_width - LOGO_WIDTH) / 2,

(matrix_height - LOGO_HEIGHT) / 2,

LOGO_WIDTH, LOGO_HEIGHT, 10, 10);

     

      /** 向瀏覽器輸出二維碼 */

      ImageIO.write(image, "png",

response.getOutputStream());

   }

}

 1.2.3 提供html頁面

<!DOCTYPE html>

<html>

   <head>

      <title>二維碼</title>

      <meta charset="UTF-8"/>

      <meta http-equiv="pragma" content="no-cache"/>

      <style type="text/css">

         body{

            background-color : black;

         }

      </style>

   </head>

   <body>

      <img alt="二維碼"

src="barcode?url=https://www.baidu.com"

         width="200" height="200"/>

   </body>

</html>