ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin” [打印本页]

作者: 卖不甜枣    时间: 2024-10-21 14:05
标题: Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin”
Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin” 开源项目 生成二维码

@
目录

1. Java当中使用 “google.zxing ” 开源项目生成二维码

这里我们使用 servlet 和 tomcat 技术进行操纵演示。
1.1 准备工作

首先在 pom.xml 文件当中导入相应所需的依赖。
  1. <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>jakarta.servlet</groupId>
  5.             <artifactId>jakarta.servlet-api</artifactId>
  6.             <version>5.0.0</version>
  7.             <scope>provided</scope>
  8.         </dependency>
  9.         
  10.         <dependency>
  11.             <groupId>com.google.zxing</groupId>
  12.             <artifactId>core</artifactId>
  13.             <version>3.1.0</version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>com.google.zxing</groupId>
  17.             <artifactId>javase</artifactId>
  18.             <version>3.1.0</version>
  19.         </dependency>
  20.         
  21.         <dependency>
  22.             <groupId>commons-lang</groupId>
  23.             <artifactId>commons-lang</artifactId>
  24.             <version>2.6</version>
  25.         </dependency>
  26.     </dependencies>
复制代码
pom.xml 完整的配置内容。
  1.     4.0.0    com.rainbowsea    zxingQRcode    1.0-SNAPSHOT    war    <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>jakarta.servlet</groupId>
  5.             <artifactId>jakarta.servlet-api</artifactId>
  6.             <version>5.0.0</version>
  7.             <scope>provided</scope>
  8.         </dependency>
  9.         
  10.         <dependency>
  11.             <groupId>com.google.zxing</groupId>
  12.             <artifactId>core</artifactId>
  13.             <version>3.1.0</version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>com.google.zxing</groupId>
  17.             <artifactId>javase</artifactId>
  18.             <version>3.1.0</version>
  19.         </dependency>
  20.         
  21.         <dependency>
  22.             <groupId>commons-lang</groupId>
  23.             <artifactId>commons-lang</artifactId>
  24.             <version>2.6</version>
  25.         </dependency>
  26.     </dependencies>            1.8        1.8        UTF-8   
复制代码
注意:我们是使用的是 tomcat 和  servlet  我们需要注意 web 的根路径是否正确,如果错误的话,是无法找到对应资源的。
对应的前端显示的页面代码的编写内容,这里我们使用 jsp 作为前端页面的展示。注意:前端页面所放的路径是在 web 目录下的
  1. <%@ page contentType="text/html; charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en" >
  4. <head>
  5.     <meta charset="UTF-8"/>
  6.     <title>生成普通黑白二维码</title>
  7. </head>
  8. <body>
  9. url:<input type="text" id="url">
  10. <hr/>
  11. <%--请输入文本内容:--%>
  12. <%--<textarea id="url" cols="60" rows="20"></textarea>--%>
  13. <button onclick="generateQRcode()">生成二维码</button>

  14. <img id="image"/>
  15. </body>
  16. </html>
复制代码
1.2 生成黑白二维码

1.2.1 zxing 常用 API

1.2.1.1 EncodeHintType (编码提示类型)


EncodeHintType 是用来设置二维码编码时的一些额外参数的枚举类型,常用枚举值如下:
1.2.1.2 MultiFormatWriter(多格式写入步伐)


MultiFormatWriter 是一个便捷的二维码生成类,可以根据传入的 BarcodeFormat 参数,生成对应类型的二维码。
MultiFormatWriter 封装了一系列的二维码生成方法,可以生成多种格式的二维码,包罗:“QR Code、Aztec Code、PDF417、Data Matrix”等。
1.2.1.3 BarcodeFormat(码格式)

BarcodeFormat 是枚举类,通过它来制定二维码格式:
1.2.1.4 BitMatrix(位矩阵)


BitMatrix 是 ZXing 库中表示二维码矩阵的数据结构,它是由 0 和 1 构成的二维数组,用于存储二维码的编码信息。在二维码生成过程中,我们通过对 BitMatrix 对象的构建和操纵,最终生成一个可被扫描解码的二维码图像。
BitMatrix 实际上是一个紧凑型的布尔型二维数组 ,往往只需要占用一个字节即可表示 S 位二进制。在使用 BitMatrix 时,我们可以通过其不同的方法,例如:get(),set() 等,来获取,设置矩阵中每个位置的值。
在 ZXing中,BitMatrix 常用于将编码后的信息转化为矩阵形式,并进行图像的生成和输出。在使用 ZXing 生成二维码时,我们首先需要使用MultiFormatWriter.encode()
方法来生成一个 BitMatrix ;然后,在对BitMatrix 进行各种处置惩罚和操纵后,就可以在 UI中显示和输出二维码。
总的来说,BitMatrix 是ZXing 库中非常重要的数据结构之一,它负责存储和处置惩罚生成二维码图像所需的二进制信息,是实现二维码生成功能的关键。
BitMatrix 常用 API:
1.2.2 将 url 生成黑白二维码

前端代码:
  1. <%@ page contentType="text/html; charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en" >
  4. <head>
  5.     <meta charset="UTF-8"/>
  6.     <title>生成普通黑白二维码</title>
  7. </head>
  8. <body>
  9. url:<input type="text" id="url">
  10. <hr/>
  11. <%--请输入文本内容:--%>
  12. <%--<textarea id="url" cols="60" rows="20"></textarea>--%>
  13. <button onclick="generateQRcode()">生成二维码</button>

  14. <img id="image"/>
  15. </body>
  16. </html>
复制代码
后端代码:
定义为一个 Servlet 进行处置惩罚前端的哀求,返回一个二维码。

  1. package com.rainbowsea.servlets;
  2. import com.google.zxing.BarcodeFormat;
  3. import com.google.zxing.EncodeHintType;
  4. import com.google.zxing.MultiFormatReader;
  5. import com.google.zxing.MultiFormatWriter;
  6. import com.google.zxing.WriterException;
  7. import com.google.zxing.common.BitMatrix;
  8. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  9. import jakarta.servlet.ServletException;
  10. import jakarta.servlet.ServletOutputStream;
  11. import jakarta.servlet.annotation.WebServlet;
  12. import jakarta.servlet.http.HttpServlet;
  13. import jakarta.servlet.http.HttpServletRequest;
  14. import jakarta.servlet.http.HttpServletResponse;
  15. import javax.imageio.ImageIO;
  16. import java.awt.image.BufferedImage;
  17. import java.io.IOException;
  18. import java.util.HashMap;
  19. import java.util.Map;
  20. @WebServlet("/create")
  21. public class GenerateQRcode extends HttpServlet {
  22.     @Override
  23.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24.         // 使用谷歌提供的 zxing开源库,生成普通的黑白二维码(核心代码)
  25.         try {
  26.             // 需要创建一个Map集合,用这个 Map集合存储二维码相关的属性(参数)
  27.             Map map = new HashMap();
  28.             // 设置二维码的误差校正级别
  29.             map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  30.             // 设置二维码的字符集
  31.             map.put(EncodeHintType.CHARACTER_SET, "utf-8");
  32.             // 设置二维码四周的留白
  33.             map.put(EncodeHintType.MARGIN, 1);
  34.             // 创建 zxing的核心对象, MultiFormatWriter (多格式写入器)
  35.             // 通过 MultiFormatWriter 对象来生成二维码
  36.             MultiFormatWriter writer = new MultiFormatWriter();
  37.             // 获取文本内容
  38.             String url = request.getParameter("url");
  39.             //writer.encode(内容,什么格式的二维码,二维码的宽度,二维码的高度,二维码的参数)
  40.             // 位矩阵对象
  41.             BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
  42.             // 获取该位矩阵的宽度
  43.             int width = bitMatrix.getWidth();
  44.             // 获取该位矩阵的高度
  45.             int height = bitMatrix.getHeight();
  46.             // 生成二维码的图片
  47.             BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  48.             // 编写一个嵌套的循环,遍历二维数组的一个循环,遍历位矩阵对象
  49.             for (int x = 0; x < width; x++) {
  50.                 for (int y = 0; y < height; y++) {
  51.                     // 0xFF000000 : 0xFFFFFFFF 表示 黑白的十六进制
  52.                     image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
  53.                 }
  54.             }
  55.             // 将图片响应到浏览器客户端上
  56.             ServletOutputStream out = response.getOutputStream();
  57.             ImageIO.write(image,"png",out);
  58.             out.flush();
  59.             out.close();
  60.         } catch (WriterException e) {
  61.             e.printStackTrace();
  62.         }
  63.     }
  64. }
复制代码
运行显示结果:

我们也可以生成一个以 文本内容 生成的一个二维码。如下:修改一下前端的提交的格式内容即可。

  1. <%@ page contentType="text/html; charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en" >
  4. <head>
  5.     <meta charset="UTF-8"/>
  6.     <title>生成普通黑白二维码</title>
  7. </head>
  8. <body>
  9. <%--url:<input type="text" id="url">--%>
  10. <hr/>
  11. 请输入文本内容:
  12. <textarea id="url" cols="60" rows="20"></textarea>
  13. <button onclick="generateQRcode()">生成二维码</button>

  14. <img id="image"/>
  15. </body>
  16. </html>
复制代码
后端代码 Servlet 不动,这样。
运行结果如下:

1.3 生成一个带 logo 的黑白二维码

前端的页面展示的代码处置惩罚:
  1. <%@ page contentType="text/html; charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en" >
  4. <head>
  5.     <meta charset="UTF-8"/>
  6.     <title>生成Log二维码</title>
  7. </head>
  8. <body>
  9. <%-- 大数据用: multipart/form-data--%>
  10. <form action="/zxingQRcode/generateWithLogon" method="post" enctype="multipart/form-data">
  11.     请输入url: <input type="text" name="url">
  12.     请选择图片: <input type="file" name="logo">
  13.     <input type="submit" value="生成带Logo的二维码">
  14. </form>
  15. </body>
  16. </html>
复制代码
后端 Servlet 代码的内容的编写,如下:
  1. package com.rainbowsea.servlets;
  2. import com.google.zxing.BarcodeFormat;
  3. import com.google.zxing.EncodeHintType;
  4. import com.google.zxing.MultiFormatWriter;
  5. import com.google.zxing.WriterException;
  6. import com.google.zxing.common.BitMatrix;
  7. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  8. import jakarta.servlet.ServletException;
  9. import jakarta.servlet.ServletOutputStream;
  10. import jakarta.servlet.annotation.MultipartConfig;
  11. import jakarta.servlet.annotation.WebServlet;
  12. import jakarta.servlet.http.HttpServlet;
  13. import jakarta.servlet.http.HttpServletRequest;
  14. import jakarta.servlet.http.HttpServletResponse;
  15. import jakarta.servlet.http.Part;
  16. import javax.imageio.ImageIO;
  17. import java.awt.*;
  18. import java.awt.geom.RoundRectangle2D;
  19. import java.awt.image.BufferedImage;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. @WebServlet("/generateWithLogon")
  25. // 设置传输文件的最大值和最小值
  26. @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, maxFileSize = 1024 * 1024 * 10, maxRequestSize = 1024 * 1024 * 100)
  27. public class GerateQRcodeWithLogon extends HttpServlet {
  28.     @Override
  29.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
  30.             IOException {
  31.         // 使用谷歌提供的 zxing开源库,生成普通的黑白二维码(核心代码)
  32.         try {
  33.             // 需要创建一个Map集合,用这个 Map集合存储二维码相关的属性(参数)
  34.             Map map = new HashMap();
  35.             // 设置二维码的误差校正级别
  36.             map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  37.             // 设置二维码的字符集
  38.             map.put(EncodeHintType.CHARACTER_SET, "utf-8");
  39.             // 设置二维码四周的留白
  40.             map.put(EncodeHintType.MARGIN, 1);
  41.             // 创建 zxing的核心对象, MultiFormatWriter (多格式写入器)
  42.             // 通过 MultiFormatWriter 对象来生成二维码
  43.             MultiFormatWriter writer = new MultiFormatWriter();
  44.             // 获取文本内容
  45.             String url = request.getParameter("url");
  46.             //writer.encode(内容,什么格式的二维码,二维码的宽度,二维码的高度,二维码的参数)
  47.             // 位矩阵对象
  48.             BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, 300, 300, map);
  49.             // 获取该位矩阵的宽度
  50.             int width = bitMatrix.getWidth();
  51.             // 获取该位矩阵的高度
  52.             int height = bitMatrix.getHeight();
  53.             // 生成二维码的图片
  54.             BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  55.             // 编写一个嵌套的循环,遍历二维数组的一个循环,遍历位矩阵对象
  56.             for (int x = 0; x < width; x++) {
  57.                 for (int y = 0; y < height; y++) {
  58.                     // 0xFF000000 : 0xFFFFFFFF 表示 黑白的十六进制
  59.                     image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
  60.                 }
  61.             }
  62.             // 给二维码添加Logo
  63.             // 第一部分: 将Logo缩放
  64.             Part logoPart = request.getPart("logo");
  65.             InputStream inputStream = logoPart.getInputStream();
  66.             BufferedImage logoImage = ImageIO.read(inputStream);
  67.             // 对获取到的logo图片进行缩放
  68.             int logoWidth = logoImage.getWidth(null);
  69.             int logoHeight = logoImage.getHeight(null);
  70.             // 对 logo 图片的大小进行一个缩放,整理
  71.             if (logoWidth > 60) {
  72.                 logoWidth = 60;
  73.             }
  74.             if (logoHeight > 60) {
  75.                 logoHeight = 60;
  76.             }
  77.             // 这一行代码非常重要,全靠它来进行缩放了
  78.             // 使用平滑缩放算法对原始的Logo图像进行缩放得到一个全新的图像
  79.             Image scaledLogo = logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);
  80.             // 第二部分: 将缩放后的Logo画到黑白二维码上
  81.             // 获取一个2D的画笔
  82.             Graphics2D graphics2D = image.createGraphics();
  83.             // 指定 logo 图片从哪里开始,也就是指定开始的坐标 x,y
  84.             int x = (300 - logoWidth) / 2;
  85.             int y = (300 - logoHeight) / 2;
  86.             // 将缩放之后的logo画上去
  87.             // 第一个参数是:logo缩放后的图片,二三参数是:坐标,第四个参数是: null
  88.             graphics2D.drawImage(scaledLogo,x,y,null);
  89.             // 创建一个具有指定位置,宽度,高度和圆角半径的圆角矩形,这个圆角矩形是用来绘制边框的
  90.             Shape shape = new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 10, 10);
  91.             // 使用一个宽度为 4 像素的基本笔触
  92.             graphics2D.setStroke(new BasicStroke(4f));
  93.             // 给 logo 画圆角矩形
  94.             graphics2D.draw(shape);
  95.             // 释放画笔
  96.             graphics2D.dispose();
  97.             // 将二维码图片响应到浏览器上
  98.             ImageIO.write(image, "png", response.getOutputStream());
  99.         } catch (WriterException e) {
  100.             e.printStackTrace();
  101.         }
  102.     }
  103. }
复制代码
运行结果

2. Java当中使用 “github 的 qrcode-plugin” 开源项目生成二维码

github 当中的 "qrcode-plugin" 开源项目,比较友好,只需要简单调用接口。
对应的 xml 文件依赖如下:
  1. <dependency>
  2.     <groupId>com.github.liuyueyi.media</groupId>
  3.     <artifactId>qrcode-plugin</artifactId>
  4.     <version>2.5.2</version>
  5. </dependency>
复制代码
2.1 准备工作:

首先在 pom.xml 文件当中导入相应所需的依赖。
  1.     <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>jakarta.servlet</groupId>
  5.             <artifactId>jakarta.servlet-api</artifactId>
  6.             <version>5.0.0</version>
  7.             <scope>provided</scope>
  8.         </dependency>
  9.         
  10.         <dependency>
  11.             <groupId>commons-lang</groupId>
  12.             <artifactId>commons-lang</artifactId>
  13.             <version>2.6</version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>com.github.liuyueyi.media</groupId>
  17.             <artifactId>qrcode-plugin</artifactId>
  18.             <version>2.5.2</version>
  19.         </dependency>
复制代码
pom.xml 完整的配置内容 。
  1.     4.0.0    com.rainbowsea    githubliuyueyi    1.0-SNAPSHOT    war    <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>jakarta.servlet</groupId>
  5.             <artifactId>jakarta.servlet-api</artifactId>
  6.             <version>5.0.0</version>
  7.             <scope>provided</scope>
  8.         </dependency>
  9.         
  10.         <dependency>
  11.             <groupId>commons-lang</groupId>
  12.             <artifactId>commons-lang</artifactId>
  13.             <version>2.6</version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>com.github.liuyueyi.media</groupId>
  17.             <artifactId>qrcode-plugin</artifactId>
  18.             <version>2.5.2</version>
  19.         </dependency>   
复制代码
注意:我们是使用的是 tomcat 和  servlet  我们需要注意 web 的根路径是否正确,如果错误的话,是无法找到对应资源的。

对应的前端显示的页面代码的编写内容,这里我们使用 jsp 作为前端页面的展示。注意:前端页面所放的路径是在 web 目录下的
  1. <%@ page contentType="text/html; charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8"/>
  6.     <title>github 开源项目生成酷炫二维码</title>
  7. </head>
  8. <body>
  9. <form action="/githubliuyueyi/generateWithLogon" method="post" enctype="multipart/form-data">
  10.     请输入url: <input type="text" name="url">
  11.     请选择图片: <input type="file" name="logo">
  12.     <input type="submit" value="生成二维码">
  13. </form>
  14. </body>
  15. </html>
复制代码
2.2 生成黑白二维码

  1. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;
  2. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;
  3. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;
  4. import com.google.zxing.WriterException;
  5. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  6. import jakarta.servlet.ServletException;
  7. import jakarta.servlet.annotation.MultipartConfig;
  8. import jakarta.servlet.annotation.WebServlet;
  9. import jakarta.servlet.http.HttpServlet;
  10. import jakarta.servlet.http.HttpServletRequest;
  11. import jakarta.servlet.http.HttpServletResponse;
  12. import javax.imageio.ImageIO;
  13. import java.awt.*;
  14. import java.awt.image.BufferedImage;
  15. import java.io.IOException;
  16. @WebServlet("/generateWithLogon")
  17. // 设置传输文件的最大值和最小值
  18. @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2,
  19.         maxFileSize = 1024 * 1024 * 10,
  20.         maxRequestSize = 1024 * 1024 * 100)
  21. public class GenerateWithQrCode extends HttpServlet {
  22.     @Override
  23.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24.         try {
  25.             String url = request.getParameter("url");
  26.             // 生成黑白二维码
  27.             BufferedImage image = QrCodeGenWrapper.of(url)
  28.                     .asBufferedImage();
  29.             // 将二维码图片响应到浏览器
  30.             ImageIO.write(image, "png", response.getOutputStream());
  31.         } catch (WriterException e) {
  32.             e.printStackTrace();
  33.         }
  34.     }
  35. }
复制代码
运行显示结果:

2.3 生成带有 Logo 的二维码

  1. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;
  2. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;
  3. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;
  4. import com.google.zxing.WriterException;
  5. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  6. import jakarta.servlet.ServletException;
  7. import jakarta.servlet.annotation.MultipartConfig;
  8. import jakarta.servlet.annotation.WebServlet;
  9. import jakarta.servlet.http.HttpServlet;
  10. import jakarta.servlet.http.HttpServletRequest;
  11. import jakarta.servlet.http.HttpServletResponse;
  12. import javax.imageio.ImageIO;
  13. import java.awt.*;
  14. import java.awt.image.BufferedImage;
  15. import java.io.IOException;
  16. @WebServlet("/generateWithLogon")
  17. // 设置传输文件的最大值和最小值
  18. @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2,
  19.         maxFileSize = 1024 * 1024 * 10,
  20.         maxRequestSize = 1024 * 1024 * 100)
  21. public class GenerateWithQrCode extends HttpServlet {
  22.     @Override
  23.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24.         try {
  25.             String url = request.getParameter("url");
  26.             // 生成带有 logo 的黑白二维码
  27.             BufferedImage image = QrCodeGenWrapper.of(url)
  28.                     .setLogo(request.getPart("logo").getInputStream())
  29.                     .setLogoRate(7) // 设置Logo图片与二维码之间的比例,7表示Logo的宽度等于二维码的 1/7
  30.                     .setLogoStyle(QrCodeOptions.LogoStyle.ROUND) // 设置logo图片的样式,将logo的边框形状设置为圆锐角
  31.                     .asBufferedImage();
  32.             
  33.             // 将二维码图片响应到浏览器
  34.             ImageIO.write(image, "png", response.getOutputStream());
  35.         } catch (WriterException e) {
  36.             e.printStackTrace();
  37.         }
  38.     }
  39. }
复制代码
运行结果:

2.4 生成彩色的二维码

  1. package com.rainbowsea.servlets;
  2. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;
  3. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;
  4. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;
  5. import com.google.zxing.WriterException;
  6. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  7. import jakarta.servlet.ServletException;
  8. import jakarta.servlet.annotation.MultipartConfig;
  9. import jakarta.servlet.annotation.WebServlet;
  10. import jakarta.servlet.http.HttpServlet;
  11. import jakarta.servlet.http.HttpServletRequest;
  12. import jakarta.servlet.http.HttpServletResponse;
  13. import javax.imageio.ImageIO;
  14. import java.awt.*;
  15. import java.awt.image.BufferedImage;
  16. import java.io.IOException;
  17. @WebServlet("/generateWithLogon")
  18. // 设置传输文件的最大值和最小值
  19. @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2,
  20.         maxFileSize = 1024 * 1024 * 10,
  21.         maxRequestSize = 1024 * 1024 * 100)
  22. public class GenerateWithQrCode extends HttpServlet {
  23.     @Override
  24.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  25.         try {
  26.             String url = request.getParameter("url");
  27.             BufferedImage image = QrCodeGenWrapper.of(url)
  28.                     .setDrawPreColor(Color.BLUE)
  29.                     .asBufferedImage();
  30.             ImageIO.write(image, "png", response.getOutputStream());
  31.         } catch (WriterException e) {
  32.             e.printStackTrace();
  33.         }
  34.     }
  35. }
复制代码

2.5 背景图的二维码

  1. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;
  2. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;
  3. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;
  4. import com.google.zxing.WriterException;
  5. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  6. import jakarta.servlet.ServletException;
  7. import jakarta.servlet.annotation.MultipartConfig;
  8. import jakarta.servlet.annotation.WebServlet;
  9. import jakarta.servlet.http.HttpServlet;
  10. import jakarta.servlet.http.HttpServletRequest;
  11. import jakarta.servlet.http.HttpServletResponse;
  12. import javax.imageio.ImageIO;
  13. import java.awt.*;
  14. import java.awt.image.BufferedImage;
  15. import java.io.IOException;
  16. @WebServlet("/generateWithLogon")
  17. // 设置传输文件的最大值和最小值
  18. @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2,
  19.         maxFileSize = 1024 * 1024 * 10,
  20.         maxRequestSize = 1024 * 1024 * 100)
  21. public class GenerateWithQrCode extends HttpServlet {
  22.     @Override
  23.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24.         try {
  25.             String url = request.getParameter("url");
  26.             // 生成带有背景图的二维码
  27.             BufferedImage image = QrCodeGenWrapper.of(url)
  28.                     .setBgImg(request.getPart("logo").getInputStream())
  29.                     .setBgOpacity(0.5F)  // 设置背景图片的透明度
  30.                     .asBufferedImage();
  31.             
  32.             // 将二维码图片响应到浏览器
  33.             ImageIO.write(image, "png", response.getOutputStream());
  34.         } catch (WriterException e) {
  35.             e.printStackTrace();
  36.         }
  37.     }
  38. }
复制代码
运行结果:

2.6 特殊形状二维码


运行结果:

2.7 图片添补二维码

  1. package com.rainbowsea.servlets;
  2. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;
  3. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;
  4. import com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;
  5. import com.google.zxing.WriterException;
  6. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  7. import jakarta.servlet.ServletException;
  8. import jakarta.servlet.annotation.MultipartConfig;
  9. import jakarta.servlet.annotation.WebServlet;
  10. import jakarta.servlet.http.HttpServlet;
  11. import jakarta.servlet.http.HttpServletRequest;
  12. import jakarta.servlet.http.HttpServletResponse;
  13. import javax.imageio.ImageIO;
  14. import java.awt.*;
  15. import java.awt.image.BufferedImage;
  16. import java.io.IOException;
  17. @WebServlet("/generateWithLogon")
  18. // 设置传输文件的最大值和最小值
  19. @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2,
  20.         maxFileSize = 1024 * 1024 * 10,
  21.         maxRequestSize = 1024 * 1024 * 100)
  22. public class GenerateWithQrCode extends HttpServlet {
  23.     @Override
  24.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  25.         try {
  26.             String url = request.getParameter("url");
  27.             BufferedImage image = QrCodeGenWrapper.of(url)
  28.                     .setErrorCorrection(ErrorCorrectionLevel.H) // 设置二维码的错误纠正规则
  29.                     .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE) // 绘制二维码时采用图片填充
  30.                     .addImg(1, 1, request.getPart("logo").getInputStream()) // 添加图片
  31.                     .asBufferedImage();
  32.             ImageIO.write(image, "png", response.getOutputStream());
  33.         } catch (WriterException e) {
  34.             e.printStackTrace();
  35.         }
  36.     }
  37. }
复制代码
运行结果:

2.8 生成 gif 动图二维码
  1. String url = request.getParameter("url");
  2. BufferedImage image = QrCodeGenWrapper.of(url)
  3.         .setW(500)
  4.         .setH(500)
  5.         .setBgImg(request.getPart("logo").getInputStream())
  6.         .setBgOpacity(0.6f)
  7.         .setPicType("gif")
  8.         .asBufferedImage();
  9. ImageIO.write(image, "gif", response.getOutputStream());
复制代码
v

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4