使用Zxing导出底部带有文字的二维码

article/2025/8/21 9:11:21

1、引入依赖

<!-- Maven 依赖 -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version>
</dependency>

2、生成二维码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class QRCodeGenerator {// 二维码尺寸private static final int QRCODE_SIZE = 512;// 背景色private static final Color BACKGROUND_COLOR = new Color(230, 132, 72);// 字体颜色private static final Color TEXT_COLOR = Color.BLACK;// 二维码与底部文字之间的间距private static final int TEXT_PADDING = 10;// 底部文字大小private static int FONT_SIZE = 22;/*** 生成带底部文字的二维码** @param content    二维码内容* @param text       底部文字* @param outputFile 输出文件*/public static void generateQRCodeWithText(String content, String text, File outputFile) throws WriterException, IOException {// 创建二维码BufferedImage qrImage = createQRCode(content);// 计算最终图片高度(二维码高度 + 文字区域高度)int height = qrImage.getHeight() + TEXT_PADDING * 2 + FONT_SIZE;int width = qrImage.getWidth();// 创建新的BufferedImage,包含二维码和文字区域BufferedImage combinedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = combinedImage.createGraphics();// 设置背景为白色g.setColor(BACKGROUND_COLOR);// 填充整个图片区域g.fillRect(0, 0, width, height);// 绘制二维码到新图片的上部g.drawImage(qrImage, 0, 0, null);// 设置文字样式String fontName = "Microsoft YaHei";// 尝试加载字体,如果找不到则使用默认字体Font font;try {font = new Font(fontName, Font.PLAIN, FONT_SIZE);} catch (Exception e) {font = new Font("Arial", Font.PLAIN, FONT_SIZE);System.err.println("警告: 无法加载中文字体 " + fontName + ", 使用默认字体");}g.setColor(TEXT_COLOR);g.setFont(new Font(fontName, Font.BOLD, FONT_SIZE));// 计算文字位置(居中)FontMetrics fontMetrics = g.getFontMetrics();int textWidth = fontMetrics.stringWidth(text);// 如果文字太长,自动缩小字体,左右各留10像素边距int maxTextWidth = width - 20;while (textWidth > maxTextWidth && FONT_SIZE > 8) {FONT_SIZE--;font = new Font(fontName, Font.PLAIN, FONT_SIZE);g.setFont(font);fontMetrics = g.getFontMetrics();textWidth = fontMetrics.stringWidth(text);}int x = (width - textWidth) / 2;int y = qrImage.getHeight() + TEXT_PADDING + fontMetrics.getAscent() / 2;// 绘制文字g.drawString(text, x, y);g.dispose();// 保存图片ImageIO.write(combinedImage, "png", outputFile);}/*** 创建基本二维码图片** @param content 二维码内容* @return BufferedImage* @throws WriterException*/private static BufferedImage createQRCode(String content) throws WriterException {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.MARGIN, 1);QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);BufferedImage image = new BufferedImage(QRCODE_SIZE, QRCODE_SIZE, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < QRCODE_SIZE; x++) {for (int y = 0; y < QRCODE_SIZE; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? TEXT_COLOR.getRGB() : BACKGROUND_COLOR.getRGB());}}return image;}public static void main(String[] args) throws IOException, WriterException {String content = "https://www.baidu.com";String text = "百度一下,你就知道";File outputFile = new File("E:\\DeskTop\\baidu.png");generateQRCodeWithText(content, text, outputFile);System.out.println("二维码已生成到: " + outputFile.getAbsolutePath());}
}

3、效果预览

在这里插入图片描述
如您在阅读中发现不足,欢迎留言!!!


http://www.hkcw.cn/article/rLjSwwKDbL.shtml

相关文章

Linux文件操作、文件夹操作

一、文件操作 二、文件夹操作

胖东来红内裤事件案宣判 百万粉丝博主赔偿40万

2025年5月28日,许昌市魏都区人民法院公开审理了许昌市胖东来商贸集团有限公司与段某之间的名誉权纠纷案,并当庭宣判。法院判决段某在其个人抖音账号“两个小段(小)”发布书面道歉信的视频,内容需经法院审核,且发布后30日内不得删除;同时,段某需赔偿许昌市胖东来商贸集团…

【Stable Diffusion 1.5 】在 Unet 中每个 Cross Attention 块中的张量变化过程

系列文章目录 文章目录 系列文章目录前言特征图和注意力图的尺寸差异原因在Break-a-Scene中的具体实现总结 前言 特征图 (Latent) 尺寸和注意力图(attention map)尺寸在扩散模型中有差异&#xff0c;是由于模型架构和注意力机制的特性决定的。 特征图和注意力图的尺寸差异原…

男子酒驾闯卡撞伤交警被刑拘 肇事司机已被控制

5月27日晚,交警在陕西西安莲湖区文景南路与农兴路十字路口附近设卡执勤时,一名男子驾车冲卡,冲毁护栏并撞伤了一名交警。该男子涉嫌酒驾,已被刑拘。事发后,该男子弃车逃离现场,但很快被执勤交警抓获。据事发地商户描述,听到撞击声后,一辆由北向南行驶的黑色商务车冲过道…

南京一公园内出现大量竹节虫 生态环境良好标志

近日,有网民在社交媒体上分享了南京老山国家森林公园内出现大量竹节虫的视频。从视频中可以看到,栏杆上布满了绿色的竹节虫,显得非常密集。29日上午,南京老山国家森林公园的工作人员确认,近期园内确实出现了不少竹节虫。不过,工作人员表示这种昆虫是无害的,不会攻击人类…

黑马点评项目02——商户查询缓存(缓存穿透、缓存雪崩、缓存击穿)以及细节

1.添加redis缓存 StringRedisTemplate 使用的是这个哈&#xff0c;有人可能有疑问&#xff0c;存放的是字符串吗&#xff0c;商铺值应该是个对象才对啊&#xff0c;在细节中解析 代码&#xff1a; Override public Result queryById(Long id) {//查询redis&#xff0c;若存在则…

python学习打卡day39

DAY 39 图像数据与显存 知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容即可 1.图像数据的格式&a…

代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )

图论part08 拓扑排序精讲 代码随想录讲解链接 题目链接 思路 在这个题目之中&#xff0c;个别文件的处理依赖于别的文件&#xff0c;因此&#xff0c;文件的处理顺序十分重要。我们用图来表示文件的处理顺序&#xff0c;文件s指向文件t&#xff0c;则说明如果要正确的处理文…

朱啸虎:曾三次错失宁德时代!

朱啸虎:曾三次错失宁德时代。近日,在腾讯视频《激流第二季》中,投资人朱啸虎谈及自己三次错失宁德时代,投资电池失败损失7000万美金的经历。他表示早期看了宁德时代三次,认为他们的技术不性感,不是最新一代,因而投了掌握美国最新一代技术的波士顿电池。结果最新的技术不…

女子观赏“蓝眼泪”失踪多方搜救 游客夜观奇景失联

5月26日傍晚,浙江台州温岭市松门镇海边的大坑沙村,23岁游客孙女士在徒步时失踪。警方和救援人员在山上和海里搜寻多日,但截至29日上午仍未找到她。孙女士生于2002年,平时与父亲一起在宁波生活。5月26日,她告诉父亲自己出去玩,当晚不回家,随后乘列车前往温岭市。当天下午…

PS linux 基础篇1-AXI_DMA

系列文章目录 文章目录 系列文章目录前言一、AXI DMA ip核二、BD工程三、PS linux工程1.使用开源的xilinx_axidma-master工程验证驱动2.按照其他的开源进行就行&#xff0c;没什么写的了 前言 PL与PS之间快速的接口&#xff0c;本文为LOOP回环测试 一、AXI DMA ip核 MM2S mem…

儿子打死父亲后母亲欲顶罪母子被判 家庭悲剧引发深思

49岁的宋甲长期酗酒,酒后经常殴打、辱骂妻儿。2024年7月5日,宋甲喝了一斤多白酒后回家辱骂儿子宋乙,妻子李某上前劝阻却被殴打。看到母亲被家暴,儿子打了父亲一拳,父子发生争吵打斗,最终儿子将父亲打死。案发后,母子共同清理现场,并焚烧了作案工具。李某为了保护儿子,…

前端-关于apk文件分片上传

为什么需要分片上传&#xff1f; 一次性处理的致命缺陷&#xff1a; 内存溢出&#xff1a;大文件完全加载到内存 界面冻结&#xff1a;读取过程阻塞主线程 上传失败&#xff1a;单次请求可能超时或被服务器拒绝 需求&#xff1a;一个弹出框&#xff0c;将apk文件上传&#x…

病理切片TLS比例作为免疫治疗响应和预后的预测因子

定义 三级淋巴结构 &#xff08;TLS&#xff0c;Tumor Lymphoid Structure&#xff09;&#xff1a;是指在非淋巴组织中的慢性炎症部位&#xff08;包括癌症&#xff09;形成的异位淋巴细胞聚集体。 目前&#xff0c;分割和量化 TLS 的金标准是基于对 T&#xff08;CD3: 用于…

Linux浅谈

Linux浅谈 一、什么是 Linux&#xff1f;先抛开 “内核”&#xff0c;看整体 可以把 Linux 系统 想象成一台 “组装电脑”&#xff1a; 最核心的零件是 “主板”—— 这就是 Linux 内核&#xff08;Kernel&#xff09;&#xff0c;负责管理电脑里的所有硬件&#xff08;比如 …

【模板-指南】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

ICASSP2025丨融合语音停顿信息与语言模型的阿尔兹海默病检测

阿尔兹海默病&#xff08;Alzheimers Disease, AD&#xff09;是一种以认知能力下降和记忆丧失为特征的渐进性神经退行性疾病&#xff0c;及早发现对于其干预和治疗至关重要。近期&#xff0c;清华大学语音与音频技术实验室&#xff08;SATLab&#xff09;提出了一种将停顿信息…

吴艳妮获亚锦赛季军 妈妈:希望她恢复最佳状态 带伤参赛展现坚韧

因当地暴雨天气,原本计划于5月29日下午5时进行的亚洲田径锦标赛女子100米栏决赛延迟至当晚9时开赛。中国选手吴艳妮以13秒068的成绩获得季军。5月28日上午,吴艳妮以13秒07的成绩晋级决赛。赛后,她的母亲熊艳表示,比赛结果并不重要,只希望她尽快恢复,以最佳状态迎接未来的…

AMBA-AHB仲裁机制

前文 仲裁机制保证了任意时刻只有一个 master 可以接入总线。Arbiter 决定了哪个向其发出接入请求的 master 可以接入总线&#xff0c;这通过优先级算法实现。AHB规范并没有给出优先级算法&#xff0c;需要设计者根据具体的系统要求定义。一般情况下 arbiter 不会中断一…

长期口臭可能是你的身体在求救 三步教你自救

有些人表面光鲜亮丽一张嘴却让人“退避三舍”尤其在晨起、空腹时口臭问题更明显不仅尴尬还可能暗藏健康隐患科学应对口臭还你清新口气!先对号入座你的口臭是临时客串还是疾病信号?1、生理性口臭:临时“小插曲”饮食作祟:大蒜、洋葱、韭菜等含硫化合物的食物,会通过血液循环…