如何在Spring Boot中实现二维码的生成以及识别二维码的功能?

createh53周前 (12-06)技术教程21

二维码(QR Code)作为现在应用开发场景中一种比较常见的信息存储和传递的手段,被广泛用在支付、登录、营销等场景中。SpringBoot作为一种后端开发技术,支持了各种系统的后端应用程序的开发。下面我们我们就来看看如何在SpringBoot中实现二维码的生成以及识别操作。

二维码生成

引入依赖

我们可以通过第三方二维码生成库ZXing(Zebra Imaging)来完成在Spring Boot中的二维码生成的功能。如下所示,首先就需要在POM文件中添加ZXing(Zebra Imaging)的依赖配置。

<dependencies>
    <!-- ZXing二维码生成和识别库 -->
    <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>

创建二维码生成工具类

引入完成之后,为了方便在不同的地方使用二维码生成功能,我们可以创建一个二维码生成的工具类用来在不同的位置提供统一的二维码生成功能,如下所示。

public class QRCodeUtils {

    /**
     * 生成二维码并输出为输出流
     * @param content 二维码内容
     * @param width 二维码图片宽度
     * @param height 二维码图片高度
     * @param outputStream 输出流
     * @throws Exception
     */
    public static void generateQRCode(String content, int width, int height, OutputStream outputStream) throws Exception {
        // 设置二维码参数
        Hashtable<EncodeHintType, Object> hintMap = new Hashtable<>();
        hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        hintMap.put(EncodeHintType.MARGIN, 1);  // 二维码的边距

        // 生成二维码矩阵
        BitMatrix bitMatrix = new com.google.zxing.qrcode.QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hintMap);
        
        // 将BitMatrix转换为图片
        BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
        
        // 输出为图片
        ImageIO.write(bufferedImage, "PNG", outputStream);
    }
}

在Spring Boot中创建二维码生成的接口

接下来,我们可以在Spring Boot的Controller层中提供一个RESTFul接口方便开发者在前端实现二维码的生成和下载操作,如下所示。实现接受请求参数并且将这个请求参数生成到二维码中并且返回生成的二维码。

@RestController
public class QRCodeController {

    @GetMapping("/generateQRCode")
    public void generateQRCode(@RequestParam("content") String content, HttpServletResponse response) throws IOException {
        // 设置响应头
        response.setContentType("image/png");
        
        try {
            QRCodeUtils.generateQRCode(content, 300, 300, response.getOutputStream());
        } catch (Exception e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error generating QR code.");
        }
    }
}

这样我们就可以通过调用http://localhost:8080/generateQRCode接口来实现一个二维码的图片。二维码生成之后,下面我们就来看看如何去识别这个二维码。

二维码识别

生成二维码与识别二维码是一个相互的逆过程,所以实现识别二维码的功能我们也是通过ZXing库来实现,在ZXing库中默认提供的就是二维码的生成以及识别的功能。如下所示,我们来定义一个用来进行通用二维码识别的工具类。

public class QRCodeReader {

    /**
     * 识别二维码图片
     * @param filePath 图片路径
     * @return 二维码内容
     * @throws Exception
     */
    public static String readQRCode(String filePath) throws Exception {
        // 读取图片
        File file = new File(filePath);
        BufferedImage bufferedImage = ImageIO.read(file);

        // 解析二维码
        LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

        // 创建二维码解码器
        QRCodeReader reader = new QRCodeReader();
        Result result = reader.decode(bitmap);

        // 返回解码内容
        return result.getText();
    }
}

结合SpringBoot技术创建一个RESTFul接口允许用户上传二维码图片到服务器端,然后服务器端通过上面的二维码识别工具识别内容之后将相关内容返回给前端显示,如下所示。

@RestController
public class QRCodeReaderController {

    @PostMapping("/readQRCode")
    public String readQRCode(@RequestParam("file") MultipartFile file) {
        try {
            // 保存上传的文件
            File imageFile = new File("uploadedQRCode.png");
            file.transferTo(imageFile);

            // 识别二维码
            String content = QRCodeReader.readQRCode(imageFile.getAbsolutePath());

            // 返回识别结果
            return content;
        } catch (Exception e) {
            return "Error reading QR code: " + e.getMessage();
        }
    }
}

这样我们就可以在http://localhost:8080/readQRCode接口中将刚刚生成的二维码传入,识别成功之后就会前端接口中反馈二维码中包含的内容信息。

总结

在上面的文章中,我们介绍了如何在Spring Boot中通过ZXing库来实现二维码的生成以及识别功能,当然上面的实现是一个简单的实现,有兴趣的读者可以结合上面的实现来实现更加丰富的功能,例如可以添加二维码中间的图片、增加边框、改变颜色等等。

相关文章

Java为什么一直这么火?

如果有人问我想学习编程,从哪一门语言入手比较好,我会推荐Java给他。首先我们先看个排行榜,TOP 10 编程语言 TIOBE 指数走势(2002-2020)来自权威开发语言排行榜TIOBE的数据(截...