首页 > 解决方案 > 如何在 JAVA 中使用 com.google.zxing libraby 在二维码下方添加文本

问题描述

我已经使用com.google.zxing这个库生成了二维码。二维码生成工作正常,但我想在二维码下方显示二维码数据。

我想生成如下所示的二维码。

在此处输入图像描述

这是我的代码。

QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(data, BarcodeFormat.QR_CODE, width, height);
        ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
        byte[] pngData = pngOutputStream.toByteArray();

标签: javaqr-codezxing

解决方案


在这里,我提供了完整的代码,用于生成带有文本的二维码。

public byte[] generateQRCode(String data, Integer width, Integer height, String[] text) {

    try {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(data, BarcodeFormat.QR_CODE, width, height);

        ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);
        byte[] pngData = pngOutputStream.toByteArray();

        //        If text is needed to display
        if (text.length > 0) {
            int totalTextLineToadd = text.length;
            InputStream in = new ByteArrayInputStream(pngData);
            BufferedImage image = ImageIO.read(in);

            BufferedImage outputImage = new BufferedImage(image.getWidth(), image.getHeight() + 25 * totalTextLineToadd, BufferedImage.TYPE_INT_ARGB);
            Graphics g = outputImage.getGraphics();
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, outputImage.getWidth(), outputImage.getHeight());
            g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
            g.setFont(new Font("Arial Black", Font.BOLD, 12));
            Color textColor = Color.BLACK;
            g.setColor(textColor);
            FontMetrics fm = g.getFontMetrics();
            int startingYposition = height + 5;
            for(String displayText : text) {
                g.drawString(displayText, (outputImage.getWidth() / 2)   - (fm.stringWidth(displayText) / 2), startingYposition);
                startingYposition += 20;
            }
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(outputImage, "PNG", baos);
            baos.flush();
            pngData = baos.toByteArray();
            baos.close();
        }

        return pngData;
    } catch (WriterException | IOException ex) {
        throw new ImtechoUserException(ex.getMessage(), 0);
    }
}

这将返回新生成的带有文本或不带文本的 QR 码的 Byte[]。


推荐阅读