Java初学者项目实战:开发一个简易的二维码生成器

发布时间 - 2026-01-09 00:00:00    点击率:
Java生成二维码需引入zxing的javase模块(3.5.3版),显式设置UTF-8编码和H级容错,用BufferedImage+白底渲染避免模糊或黑块,路径含中文时确保环境UTF-8编码。

Java 生成二维码本身不难,但初学者常卡在依赖引入失败、中文乱码、输出图片模糊或路径写错这几个地方。用 zxing 是最稳妥的选择,别碰那些包装过头的“一键生成”工具类。

用 Maven 引入 zxing 的正确坐标

别用旧版 core 单独依赖——它只负责编码逻辑,不带图像输出能力;必须同时加 javase 模块,否则调 MatrixToImageWriter.writeToPath() 会报 NoClassDefFoundError


  com.google.zxing
  javase
  3.5.3
  • 版本选 3.5.3(最新稳定版),3.6.0 开始要求 Java 11+,初学者用 JDK 8/11 都兼容的 3.5.3 更省心
  • 如果用 Gradle,写成 implementation 'com.google.zxing:javase:3.5.3',别漏掉 :javase
  • 手动下载 jar 包的同学:必须同时放 core-3.5.3.jarjavase-3.5.3.jar 进 classpath

生成含中文的二维码不乱码的关键设置

默认编码是 ISO-8859-1,一写中文就变方块或抛 WriterException。必须显式指定字符集为 UTF-8,且要传进 EncodeHintType.CHARACTER_SET 这个 hint。

Map hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 推荐 H 级容错
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
  • content 字符串本身用 UTF-8 编码保存源文件即可,不用额外 new String(content.getBytes("GBK"), "UTF-8") 转来转去
  • 容错等级选 H(30% 损毁可恢复),比默认的 L(7%)更实用,尤其扫码环境光线差时
  • 如果提示 “Content too long”,不是代码错,是内容超出了当前尺寸能容纳的码字上限——要么压缩文本,要么调大 width/height

保存为 PNG 时图片模糊或空白的常见原因

直接用 MatrixToImageWriter.writeToPath() 写出的图有时边缘发虚、有灰边,甚至全黑——根本原因是默认渲染质量低,且没处理透明背景。

BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
// 关键:开启抗锯齿 + 设置背景为白色
image = toWhiteBackground(image);
ImageIO.write(image, "PNG", new File(outputPath));

其中 toWhiteBackground() 可简单实现:

private static BufferedImage toWhiteBackground(BufferedImage src) {
    BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = dest.createGraphics();
    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, dest.getWidth(), dest.getHeight());
    g2d.drawImage(src, 0, 0, null);
    g2d.dispose();
    return dest;
}
  • 别用 TYPE_INT_RGB,它不支持 alpha 通道,遇到 zxing 默认生成的半透明像素会出黑块
  • 如果输出路径含中文(如 "D:\\我的二维码\\code.png"),File 构造没问题,但确保运行环境终端/IDE 的默认编码是 UTF-8,否则可能抛 FileNotFoundException
  • 宽高建议设为 300×300 或 400×400,太小(如 100×100)会导致手机扫码困难

真正麻烦的不是生成逻辑,而是把 BitMatrix 转成清晰、兼容性好、带白底的 PNG 这一步——初学者容易以为“能出图就行”,结果扫不出来才回头折腾。留心 BufferedImage 类型和背景填充,比反复调参数有用得多。


# java  # go  # 编码  # 工具  # 中文乱码  # google  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python面向对象测试方法_mock解析【教程】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何快速配置高效服务器建站软件?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何注册花生壳免费域名并搭建个人网站?  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel如何使用Eloquent进行子查询  高性能网站服务器配置指南:安全稳定与高效建站核心方案  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  清除minerd进程的简单方法  如何用西部建站助手快速创建专业网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  浅谈javascript alert和confirm的美化  微信小程序 配置文件详细介绍  Java类加载基本过程详细介绍  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  如何正确选择百度移动适配建站域名?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Thinkphp 中 distinct 的用法解析  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  手机软键盘弹出时影响布局的解决方法  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何在云主机上快速搭建多站点网站?  黑客入侵网站服务器的常见手法有哪些?  Swift中swift中的switch 语句  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何快速完成中国万网建站详细流程?  简单实现Android验证码  如何确保西部建站助手FTP传输的安全性?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何创建自定义Facades?(详细步骤)  想要更高端的建设网站,这些原则一定要坚持!  轻松掌握MySQL函数中的last_insert_id()  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  高端建站三要素:定制模板、企业官网与响应式设计优化  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  网站建设整体流程解析,建站其实很容易!