文章目录

  • 一、二维码生成示例
  • 二、使用步骤
  • 1.引入Maven库
  • 2.二维码不带背景图片示例
  • 3.二维码带背景图片示例


  • 提示:以下是本篇文章正文内容,下面案例可供参考

    一、二维码生成示例

    这里是一个完整的示例代码,用于生成带有自定义背景图片的二维码并将其转换为Base64编码的字符串

    二、使用步骤

    1.引入Maven库

    代码如下(示例):

    <dependencies>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version>
        </dependency>
    </dependencies>
    

    2.二维码不带背景图片示例

    代码如下(示例):

    import com.google.zxing.BarcodeFormat; // 导入条码格式类
    import com.google.zxing.EncodeHintType; // 导入编码提示类型类
    import com.google.zxing.WriterException; // 导入写入异常类
    import com.google.zxing.qrcode.QRCodeWriter; // 导入二维码写入器类
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; // 导入错误纠正级别类
    import com.google.zxing.common.BitMatrix; // 导入位矩阵类
    
    import javax.imageio.ImageIO; // 导入图像 I/O 类
    import java.awt.Graphics2D; // 导入 2D 图形类
    import java.awt.image.BufferedImage; // 导入缓冲图像类
    import java.io.ByteArrayOutputStream; // 导入字节数组输出流类
    import java.io.IOException; // 导入 IO 异常类
    import java.util.Base64; // 导入 Base64 编码类
    import java.util.EnumMap; // 导入枚举映射类
    import java.util.Map; // 导入映射接口
    
    public class QRCodeGenerator {
    
        // 生成二维码并转换为 Base64 字符串的方法
        public static String generateQRCodeToBase64(String text, int width, int height) throws WriterException, IOException {
            // 创建一个枚举映射,用于存储二维码的配置信息
            Map<EncodeHintType, Object> hintMap = new EnumMap<>(EncodeHintType.class);
            // 设置错误纠正级别为低
            hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
    
            // 创建一个二维码写入器实例
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            // 使用写入器将文本编码为位矩阵,指定宽度、高度和提示信息
            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hintMap);
    
            // 将位矩阵转换为缓冲图像
            BufferedImage bufferedImage = matrixToBufferedImage(bitMatrix);
    
            // 创建一个字节数组输出流,用于存储图像数据
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            // 将缓冲图像写入字节数组输出流,格式为 PNG
            ImageIO.write(bufferedImage, "png", outputStream);
    
            // 将字节数组输出流转换为字节数组
            byte[] qrCodeBytes = outputStream.toByteArray();
            // 将字节数组编码为 Base64 字符串
            return Base64.getEncoder().encodeToString(qrCodeBytes);
        }
    
        // 将位矩阵转换为缓冲图像的方法
        private static BufferedImage matrixToBufferedImage(BitMatrix matrix) {
            int width = matrix.getWidth(); // 获取位矩阵的宽度
            int height = matrix.getHeight(); // 获取位矩阵的高度
            // 创建一个缓冲图像,类型为 RGB
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 获取图像的 2D 图形上下文
            Graphics2D graphics = image.createGraphics();
            // 设置背景颜色为白色并填充整个图像
            graphics.setColor(java.awt.Color.WHITE);
            graphics.fillRect(0, 0, width, height);
            // 设置前景颜色为黑色
            graphics.setColor(java.awt.Color.BLACK);
            // 遍历位矩阵的每个像素
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    // 如果位矩阵在当前位置为真,则填充一个黑色像素点
                    if (matrix.get(x, y)) {
                        graphics.fillRect(x, y, 1, 1);
                    }
                }
            }
            graphics.dispose(); // 释放图形上下文
            return image; // 返回生成的缓冲图像
        }
    
        public static void main(String[] args) {
            String text = "https://www.example.com"; // 设置要编码的文本
            int width = 300; // 设置二维码的宽度
            int height = 300; // 设置二维码的高度
            try {
                // 调用生成二维码的方法,并获取 Base64 编码的字符串
                String base64QRCode = generateQRCodeToBase64(text, width, height);
                System.out.println(base64QRCode); // 输出 Base64 编码的字符串
            } catch (Exception e) {
                e.printStackTrace(); // 打印异常堆栈跟踪
            }
        }
    }
    
    

    3.二维码带背景图片示例

    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.qrcode.QRCodeWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.WriterException;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.util.Base64;
    import java.util.EnumMap;
    import java.util.Map;
    
    public class QRCodeGenerator {
    
        public static void main(String[] args) {
            try {
                String text = "https://example.com";
                int width = 300;
                int height = 300;
    
                // 生成带有自定义背景的二维码并转换为Base64
                String qrCodeBase64 = generateQRCodeToBase64(text, width, height);
                System.out.println("QR Code Base64: " + qrCodeBase64);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static String generateQRCodeToBase64(String text, int width, int height) throws WriterException, IOException {
            Map<EncodeHintType, Object> hintMap = new EnumMap<>(EncodeHintType.class);
            hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
    
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hintMap);
    
            // 加载自定义背景图片
            BufferedImage backgroundImage = ImageIO.read(new File("path/to/your/background/image.png"));
    
            // 将背景图片缩放到与二维码相同的大小
            BufferedImage scaledBackgroundImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = scaledBackgroundImage.createGraphics();
            g.drawImage(backgroundImage, 0, 0, width, height, null);
            g.dispose();
    
            BufferedImage bufferedImage = matrixToBufferedImage(bitMatrix, scaledBackgroundImage);
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", outputStream);
    
            byte[] qrCodeBytes = outputStream.toByteArray();
            return Base64.getEncoder().encodeToString(qrCodeBytes);
        }
    
        private static BufferedImage matrixToBufferedImage(BitMatrix matrix, BufferedImage backgroundImage) {
            int width = matrix.getWidth();
            int height = matrix.getHeight();
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = image.createGraphics();
            
            // 绘制背景图片
            graphics.drawImage(backgroundImage, 0, 0, width, height, null);
            
            // 绘制二维码
            graphics.setColor(Color.BLACK);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    if (matrix.get(x, y)) {
                        graphics.fillRect(x, y, 1, 1);
                    }
                }
            }
            
            graphics.dispose();
            return image;
        }
    }
    
    

    说明
    依赖项:

    确保在你的项目中包含了ZXing库的依赖,它提供了生成二维码的功能。
    路径替换:

    请将 “path/to/your/background/image.png” 替换为你自己的背景图片路径。
    主要方法:

    generateQRCodeToBase64 方法负责生成二维码并将其转换为Base64编码的字符串。
    matrixToBufferedImage 方法负责将二维码数据绘制到自定义背景图片上。


    作者:人要靠自己  

    物联沃分享整理
    物联沃-IOTWORD物联网 » java 生成二维码

    发表回复