如何使用 Java 生成二维码并返回图片

如何使用 Java 生成二维码并返回图片

二维码(QR Code)广泛应用于各种场景,例如支付、网站跳转、信息传递等。本文将向你展示如何在 Java 中使用 ZXing 库生成二维码,并将其以图片的形式返回给客户端。


步骤 1:引入 ZXing 库

首先,我们需要在 Java 项目中引入 ZXing 库。ZXing 是一个开源库,支持生成和解析二维码及条形码。你可以通过 Maven 或 Gradle 将其添加到项目中。

使用 Maven

pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.google.zxinggroupId>
    <artifactId>coreartifactId>
    <version>3.4.1version>
dependency>
使用 Gradle

build.gradle 中添加:

implementation 'com.google.zxing:core:3.4.1'

步骤 2:编写二维码生成代码

我们将编写一个 Spring Boot 控制器,提供一个 API 接口,通过这个接口可以生成二维码,并将其返回为图片。

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
public class QRCodeController {

    // 获取二维码,直接返回图片
    @GetMapping("/generateQRCode")
    public void generateQRCode(@RequestParam("url") String url, HttpServletResponse response) throws WriterException, IOException {
        // 二维码的宽度和高度
        int width = 300;
        int height = 300;

        // 配置二维码生成的参数
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符集
        hints.put(EncodeHintType.MARGIN, 1); // 设置二维码的边距
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 设置错误修正等级

        // 使用 ZXing 库生成二维码矩阵
        BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);

        // 将二维码矩阵转换为字节数组
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);

        // 设置响应类型为图片格式
        response.setContentType("image/png");

        // 设置响应头,告知浏览器该响应为二维码图片
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=qr-code.png");

        // 将二维码字节数组写入到输出流
        response.getOutputStream().write(outputStream.toByteArray());
        response.getOutputStream().flush();
    }
}

✨ 代码解析
  1. 二维码生成
    我们使用 ZXing 提供的 MultiFormatWriter.encode() 方法来生成二维码矩阵。矩阵中包含了二维码的所有信息。

  2. 二维码参数配置
    在生成二维码时,我们传入了一些配置参数,比如字符集、边距和错误修正等级等:

    • CHARACTER_SET:二维码的字符编码格式,通常我们使用 UTF-8
    • MARGIN:二维码的外边距,设置为 1
    • ERROR_CORRECTION:二维码的错误修正等级,越高的等级能容忍更多的错误和缺失,通常选择 L(低)级别。
  3. 输出二维码图片
    使用 MatrixToImageWriter.writeToStream() 方法将二维码矩阵写入输出流,并设置 Content-Typeimage/png,这样浏览器可以正确地识别并显示图片。

  4. 响应头设置
    我们设置了 Content-Dispositioninline,表示直接在浏览器中显示图片,而不是下载。文件名设置为 qr-code.png


步骤 3:调用接口获取二维码

你可以通过浏览器或 Postman 调用此接口,生成对应的二维码。请求的 URL 格式如下:

http://localhost:8080/generateQRCode?url=https://www.example.com

通过访问上述链接,浏览器会返回一个二维码图片,二维码内容为 https://www.example.com


小结

通过上述步骤,你可以使用 Java 和 ZXing 库快速生成二维码并将其以图片形式返回给客户端。这样做的好处是避免了 Base64 编码带来的复杂性,直接以图片的形式返回,更加方便用户查看和下载二维码。

此方法不仅适用于网站 URL,也可以应用于各种场景,例如生成动态二维码、生成带有不同信息的二维码等。


如果你有任何问题,欢迎留言讨论!希望这篇文章对你有所帮助。


相关资源

  • ZXing GitHub 官方库
  • 二维码在线生成工具

你可能感兴趣的:(java,开发语言)