Java中使用ZXing和QRCode生成二维码的示例详解

 更新时间:2024年09月27日 10:30:57   作者:码农研究僧  
生成二维码在Java中有多种方法,常用的是通过第三方库来实现,比较流行的库包括 ZXing (Zebra Crossing) 和 QRCode,本文小编就给大家介绍了Java中使用ZXing和QRCode生成二维码的示例,需要的朋友可以参考下

1. 基本知识

生成二维码在Java中有多种方法,常用的是通过第三方库来实现,比较流行的库包括 ZXing (Zebra Crossing) 和 QRCode

ZXing库中的核心API

  • MultiFormatWriter.encode():生成二维码矩阵
  • MatrixToImageWriter.writeToPath():将二维码矩阵保存为图片文件

QRCode库中的核心API

  • QRCode.from(content):从内容生成二维码
  • withSize(width, height):设置二维码的尺寸
  • file():生成二维码并保存为图片文件

ZXing库功能强大,适合生成复杂的二维码且提供了细粒度的控制
QRCode库使用简单,快速生成二维码,适合基础需求

二维码是一种将信息编码为二维图形的技术,常用于存储URL、文本、数字等信息。它由黑白模块组成,通常可以通过扫描来解码

生成二维码的过程主要分为两个步骤:

  • 编码:将需要存储的信息(如URL、文本等)编码为二维码的黑白模块
  • 绘制:根据编码信息绘制出二维码图像,通常可以保存为PNG、JPG等格式

使用ZXing生成二维码 ZXing是最常用的Java二维码生成库,支持多种格式(例如二维码、条形码)
其核心类包括:

  • MultiFormatWriter:用于生成二维码的核心类
  • BitMatrix:二维码的矩阵表示,用于保存黑白模块的分布
  • MatrixToImageWriter:将二维码矩阵转化为图片

二维码的参数设置

  • 宽度和高度:二维码图片的尺寸,通常是正方形
  • 编码字符集:通常使用UTF-8编码,确保支持中文等特殊字符
  • 错误纠正级别:二维码的容错能力,可以通过调整纠错级别提高二维码的鲁棒性

2. ZXing

依赖库配置(Maven项目)

在Maven项目中,需要在pom.xml中添加ZXing的依赖:

<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>

Demo如下:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Writer;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class QRCodeGenerator {

    public static void main(String[] args) {
        // 要编码的文本
        String data = "Hello, QR Code!";
        // 生成的二维码图片文件路径
        String filePath = "qrcode.png";

        try {
            // 调用生成二维码的方法
            generateQRCodeImage(data, 300, 300, filePath);
            System.out.println("二维码生成成功!");
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成二维码图像并保存到文件
     *
     * @param text   要编码的文本
     * @param width  图像宽度
     * @param height 图像高度
     * @param filePath 保存文件路径
     * @throws WriterException 生成二维码异常
     * @throws IOException     IO异常
     */
    private static void generateQRCodeImage(String text, int width, int height, String filePath)
            throws WriterException, IOException {
        // 创建 QRCodeWriter 实例
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        // 生成 BitMatrix,表示二维码的黑白矩阵
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);

        // 创建一个 BufferedImage,用于绘制图像
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        image.createGraphics();

        // 获取图形上下文
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        // 设置背景色为白色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, width, height);
        // 设置前景色为黑色
        graphics.setColor(Color.BLACK);

        // 在图像上绘制二维码的黑色矩阵
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                if (bitMatrix.get(i, j)) {
                    // 如果当前位置为黑色,填充一个像素
                    graphics.fillRect(i, j, 1, 1);
                }
            }
        }

        // 将图像保存为 PNG 文件
        ImageIO.write(image, "png", new File(filePath));
    }
}

截图如下:

另外一个Demo:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class QRCodeGenerator {

    /**
     * 生成二维码
     * @param content 二维码中包含的内容,如URL或文本
     * @param width   二维码的宽度
     * @param height  二维码的高度
     * @param filePath 保存二维码图片的路径
     * @throws Exception 可能抛出的异常
     */
    public static void generateQRCode(String content, int width, int height, String filePath) throws Exception {
        // 定义二维码的参数
        Map<EncodeHintType, Object> hints = new HashMap<>();
        // 设置编码字符集
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置二维码的容错级别,较高容错级别适合损坏或部分覆盖的二维码
        hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);

        // 生成二维码的BitMatrix(二维码的矩阵表示)
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

        // 将二维码矩阵保存为图片文件
        Path path = Paths.get(filePath);
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);

        System.out.println("二维码已成功生成,保存路径: " + filePath);
    }

    public static void main(String[] args) {
        try {
            // 生成二维码的内容
            String content = "https://www.example.com";
            // 设置二维码的宽度和高度
            int width = 300;
            int height = 300;
            // 保存二维码图片的路径
            String filePath = "qr_code.png";

            // 调用生成二维码方法
            generateQRCode(content, width, height, filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. QRCode

QRGen的xml依赖包

QRGen JavaSE » 3.0.1的xml依赖包

在Maven项目中,需要在pom.xml中添加QRCode的依赖:

以上就是Java中使用ZXing和QRCode生成二维码的示例详解的详细内容,更多关于Java ZXing和QRCode生成二维码的资料请关注脚本之家其它相关文章!

相关文章

  • Java剑指offer之删除链表的节点

    Java剑指offer之删除链表的节点

    这篇文章主要介绍了Java剑指offer之删除链表的节点,给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点,下文更多相关内容介绍,需要的小伙伴可以参考一下
    2022-04-04
  • MyBatis整合Redis实现二级缓存的示例代码

    MyBatis整合Redis实现二级缓存的示例代码

    这篇文章主要介绍了MyBatis整合Redis实现二级缓存的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java实现2048游戏源代码

    java实现2048游戏源代码

    这篇文章主要为大家详细介绍了java实现2048游戏源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Jvm调优和SpringBoot项目优化的详细教程

    Jvm调优和SpringBoot项目优化的详细教程

    这篇文章主要介绍了Jvm调优和SpringBoot项目优化,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring-IOC容器中的常用注解与使用方法详解

    Spring-IOC容器中的常用注解与使用方法详解

    Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,这篇文章给大家详细介绍Spring-IOC容器中的常用注解与使用方法,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • Spring Boot 与 Kotlin 上传文件的示例代码

    Spring Boot 与 Kotlin 上传文件的示例代码

    这篇文章主要介绍了Spring Boot 与 Kotlin 上传文件的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java字节码增强技术知识点详解

    Java字节码增强技术知识点详解

    在本篇文章里小编给大家整理的是一篇关于Java字节码增强技术知识点详解内容,有兴趣的朋友可以跟着学习下。
    2021-08-08
  • Aspectj框架实战案例详解

    Aspectj框架实战案例详解

    这篇文章主要介绍了Aspectj框架实战,结合具体案例形式详细分析了Aspectj框架具体配置、使用、编译等相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • springboot后端接收前端传数组参数三种方法

    springboot后端接收前端传数组参数三种方法

    这篇文章主要给大家介绍了关于springboot后端接收前端传数组参数三种方法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-07-07
  • 解决SpringBoot框架因post数据量过大没反应问题(踩坑)

    解决SpringBoot框架因post数据量过大没反应问题(踩坑)

    这篇文章主要介绍了解决SpringBoot框架因post数据量过大没反应问题(踩坑),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论