java - 如何在 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();
解决方案
在这里,我提供了完整的代码,用于生成带有文本的二维码。
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[]。
推荐阅读
- java - 除非我添加带注释的接口,否则自定义 Jackson 反序列化会导致 StackOverflowError
- sql - Group by sum 交易报告的一些问题
- python - 在 TensorFlow 中构建模型时如何修复 ValueError?
- python - Pandas:如何对子类别中的前 N 个观察值进行子集化(和求和)?
- c# - 如何使用 SelectionUnit = Cell 取消选择 WPF DataGrid 中的选定单元格
- mongodb - MongoClient $in 不适用于 int 数组
- web - 我应该收取多少费用来使用 shopify 更新网站
- java - 像 C# 中的 cw 一样自动完成 System.out.println("")
- google-app-maker - APPMAKER - 多对多关系不起作用
- ssms-2012 - SQL Server 版本冲突