qrcode.encode 生成 *image.rgba 需经 png.encode 编码为 png 字节流才能写入文件或响应;必须检查 error、确保 utf-8 或 url 编码中文、正确设置尺寸参数,定制颜色/logo 需手动操作像素,高并发宜缓存 png 字节。

qrcode.Encode 三行能出图,但直接写文件或响应体前必须做两件事
能,qrcode.Encode 本身只要一行,加上文件写入和错误处理,三行确实够——但很多人卡在“生成了却看不到图”上,问题不在库,而在后续动作没跟上。
- 它返回的是
*image.RGBA,不是 PNG 字节流;想存文件或吐给 HTTP 响应,必须用png.Encode手动编码,否则得到的是原始像素数据,浏览器打不开、file.Write写出来也是损坏的 - 调用
qrcode.Encode后必须检查error:内容含空字节、控制字符或超长(如 >2KB),会直接返回qrcode: content contains invalid characters,不判断就 panic 或静默失败 - 尺寸参数是整数(如
256),不是字符串,也不是 DPI;传"256"会编译报错,传负数或0会 panic
中文扫码失败?不是库的问题,是传参姿势错了
微信、支付宝旧版扫码器对 UTF-8 中文 QR 码兼容性差,不是 go-qrcode 不支持中文,而是你把原始中文字符串直接塞进去了。
- 确保输入是合法 UTF-8:
utf8.Valid([]byte(s))可校验,但更稳妥的做法是 URL 编码——尤其当内容要作为链接跳转时,用url.QueryEscape("你好世界"),避免 & = 等符号被解析错 - 别混用全角标点(如“。”、“,”)和不可见控制符(比如从富文本复制带格式的文本),某些扫码器会截断或拒识
- 如果必须原样显示中文且目标设备明确支持(如支付宝最新版),可加
qrcode.WithVersion(10)提升容量,但注意:版本号越高,二维码越密、越难扫,体积也明显增大
想改颜色、加 Logo?别碰库配置,得自己画像素
qrcode.WithQRCodeColor 和 qrcode.WithBackgroundColor 看似能设色,其实只是在 PNG 编码阶段重映射黑白值,不能真正自定义前景/背景逻辑;加 Logo 更是完全不支持——所有“定制”都得靠拿到 *image.RGBA 后手动操作。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- 改颜色:遍历每个像素,用
img.RGBAAt(x, y)判断是否为黑点(r ),再用 <code>img.SetRGBA(x, y, rNew 覆盖(注意 Go 的 <code>color.RGBA是 16 位分量) - 加 Logo:先用
resize缩放 logo 图片,再用draw.Draw贴到中心区域;关键是要避开三个定位角标(左上、右上、左下大方块),通常留出边距 ≥ 4 模块,坐标算错会导致扫码失败 - 导出 JPEG?别试。
go-qrcode输出 RGBA 图像,JPEG 不支持透明,强制转会导致黑底或色偏;坚持用 PNG
HTTP 接口高并发下 CPU 爆满?缓存比优化调用更有效
qrcode.Encode 是纯 CPU 密集型操作,无状态、线程安全,但每个请求都重算矩阵+绘图,QPS 上千时 CPU 很容易 100%。试图复用 *png.Encoder 或 sync.Pool 缓存 *image.RGBA 收效甚微,还易引发尺寸错乱。
- 最简单有效的办法:用
text + size当 key,缓存生成好的[]byte(PNG 数据),加 TTL 控制(如 1 小时),总大小限制在 100MB 内 - 前端传参务必先
url.QueryUnescape,否则?text=https%3A%2F%2Fexample.com会被当成普通字符串扫出错链接 - 响应头顺序不能错:
w.Header().Set("Content-Type", "image/png")必须在png.Encode或w.Write之前调用,否则 header 已隐式写出,设置无效,浏览器当文本渲染乱码
真正难的不是生成二维码,而是让生成结果在各种扫码器里稳定可用、在高并发下不拖垮服务、在加定制需求时不掉进图像坐标和颜色通道的坑里。这些细节不写进日志,也不报错,但上线后全靠用户反馈才能发现。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










