如何使用 JAVA 中的 com.google.zxing 库在 QR 码下方添加文本

how to add text below QR code using com.google.zxing libraby in JAVA

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

我想生成如下附件中的二维码。

这是我的代码。

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();

在这里我生成了二维码文件并进入内存,然后使用图形库。 使用此库可以将文本添加到该内存并再次保存。

public static void main(String[] args) {        
   try {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode("Hello world", BarcodeFormat.QR_CODE, 300, 300);
        Path path = FileSystems.getDefault().getPath("test.png");
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);     
        
        
                  
       final BufferedImage image = ImageIO.read(new File(path.toString()));
       JFrame frame = new JFrame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       Graphics g = image.getGraphics();
       g.setFont(g.getFont().deriveFont(22f));
       Color textColor = Color.BLACK;
       g.setColor(textColor);
       g.drawString("Hello world", 15, 300);
       g.dispose();

       ImageIO.write(image, "png", new File("test45.png"));
        
                   
    } catch (WriterException | IOException ex) {
        
    }  
}

这里我已经提供了生成有无文字二维码的完整代码

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);
    }
}

这将 return Byte[] 个新生成的带文本或不带文本的 QR 码。

@Ashish Khokhariya 谢谢你,我用你的代码来做 很抱歉我不能“反馈”: 感谢您的反馈!声望低于 15 的投票会被记录下来,但不会更改公开显示的 post 分数。