You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter下文本转二维码及逆向解析的技术实现咨询

使用ZXing实现二维码与Base64的互转及文本解析

依赖配置

Maven(pom.xml)

<dependencies>
    <!-- ZXing核心库 -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.4.1</version>
    </dependency>
    <!-- ZXing JavaSE扩展(处理图片生成/解析) -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.4.1</version>
    </dependency>
    <!-- 图片IO支持(处理BufferedImage转字节数组) -->
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
        <version>1.4.0</version>
    </dependency>
    <!-- 命令行参数解析(可选,用于快速测试) -->
    <dependency>
        <groupId>com.beust</groupId>
        <artifactId>jcommander</artifactId>
        <version>1.78</version>
    </dependency>
</dependencies>

Gradle(build.gradle)

dependencies {
    implementation 'com.google.zxing:core:3.4.1'
    implementation 'com.google.zxing:javase:3.4.1'
    implementation 'com.github.jai-imageio:jai-imageio-core:1.4.0'
    implementation 'com.beust:jcommander:1.78'
}

核心功能实现

1. 文本生成二维码并转为Base64

将目标文本(如你提供的示例字符串)生成二维码图片,再编码为Base64字符串,可直接用于API返回:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

public class QRCodeBase64Utils {
    // 生成二维码的尺寸(可根据文本长度调整)
    private static final int QR_CODE_SIZE = 500;

    public static String textToQRCodeBase64(String text) throws WriterException, IOException {
        // 1. 生成二维码矩阵
        QRCodeWriter writer = new QRCodeWriter();
        BitMatrix bitMatrix = writer.encode(
                text,
                BarcodeFormat.QR_CODE,
                QR_CODE_SIZE,
                QR_CODE_SIZE
        );

        // 2. 将矩阵转为BufferedImage并输出为字节数组
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);

        // 3. 编码为Base64字符串(可选添加data URI前缀用于浏览器直接显示)
        byte[] imageBytes = outputStream.toByteArray();
        return Base64.getEncoder().encodeToString(imageBytes);
        // 浏览器显示用:return "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes);
    }
}

2. Base64解码为二维码并解析文本

将API返回的Base64字符串解码为二维码图片,再解析出原始文本:

import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Base64;

public class QRCodeBase64Utils {
    // ... 保留上面的textToQRCodeBase64方法 ...

    public static String qrCodeBase64ToText(String base64Str) throws IOException, NotFoundException {
        // 1. 移除可能的data URI前缀(如果存在)
        if (base64Str.startsWith("data:image/")) {
            base64Str = base64Str.split(",")[1];
        }

        // 2. 解码Base64为字节数组并转为图片
        byte[] imageBytes = Base64.getDecoder().decode(base64Str);
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));

        // 3. 解析二维码文本
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
                new BufferedImageLuminanceSource(image)
        ));
        Result result = new MultiFormatReader().decode(bitmap);
        return result.getText();
    }
}

3. 命令行测试工具(基于JCommander)

如果需要快速验证功能,可编写命令行工具支持生成/解析两种模式:

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.google.zxing.WriterException;
import com.google.zxing.NotFoundException;
import java.io.IOException;

public class QRCodeCli {
    @Parameter(names = {"-g", "--generate"}, description = "生成二维码Base64,后跟目标文本")
    private String generateText;

    @Parameter(names = {"-p", "--parse"}, description = "解析二维码Base64,后跟Base64字符串")
    private String parseBase64;

    public static void main(String[] args) throws WriterException, IOException, NotFoundException {
        QRCodeCli cli = new QRCodeCli();
        JCommander.newBuilder()
                .addObject(cli)
                .build()
                .parse(args);

        if (cli.generateText != null) {
            String base64 = QRCodeBase64Utils.textToQRCodeBase64(cli.generateText);
            System.out.println("生成的二维码Base64:\n" + base64);
        } else if (cli.parseBase64 != null) {
            String text = QRCodeBase64Utils.qrCodeBase64ToText(cli.parseBase64);
            System.out.println("解析出的文本:\n" + text);
        } else {
            System.out.println("请指定 -g 生成或 -p 解析参数");
        }
    }
}

注意事项

  • 纠错级别:针对长文本(如示例字符串),建议添加高纠错级别避免扫描失败,修改生成逻辑:
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    import java.util.HashMap;
    import java.util.Map;
    
    // 在textToQRCodeBase64方法中添加:
    Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    BitMatrix bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, QR_CODE_SIZE, QR_CODE_SIZE, hints);
    
  • Base64格式:确保API返回的Base64为纯图片数据,代码已兼容带data URI前缀的情况。
  • 图片格式:示例使用PNG,可改为JPG等,只需修改MatrixToImageWriter.writeToStream的第二个参数。

内容的提问来源于stack exchange,提问作者FeelGood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:00:53