go-qrcode是纯go实现的跨平台二维码库,支持生成png、自定义颜色、内存输出及logo合成,需注意纠错等级、空内容panic、bytes.buffer线程安全等细节。

go-qrcode 生成基础二维码:几行代码就能跑起来
直接用 skip2/go-qrcode 生成带内容的二维码,不需要额外图像处理知识。它底层调用 qrcode 库(非 CGO),纯 Go 实现,跨平台无依赖。
安装命令是:
go get github.com/skip2/go-qrcode
最简示例生成 PNG 文件:
err := qrcode.WriteFile("https://example.com", qrcode.Medium, 256, "qrcode.png")
这里三个关键参数:"https://example.com" 是内容,qrcode.Medium 是纠错等级(可选 Low/Medium/High/High),256 是输出图像宽高(单位像素)。
常见错误:传入空字符串或超长内容(>2953 字节 UTF-8)会 panic;没检查 err 导致文件写失败却无感知。
自定义二维码颜色和背景:别被默认黑白限制住
skip2/go-qrcode 原生不支持改色,但提供 qrcode.Write 接口返回 *image.RGBA,你可以自己画。
实操分三步:
- 调用
qrcode.Encode得到二值位图(*image.Gray) - 新建
*image.RGBA,遍历每个像素点,按灰度值决定填前景色还是背景色 - 用
png.Encode写出结果
注意:不要直接修改 Encode 返回的 *image.Gray 的 Pix,它只含 0/255 两个值,且结构不可写;必须新建目标图像再映射。
纠错等级越高,同样内容生成的模块越多,图像越“密”,换色后噪点感可能更明显——这不是 bug,是纠错冗余的视觉体现。
内存中生成二维码(不写磁盘):Web 服务返回 PNG 流的关键
HTTP handler 里不能每次都写文件再读取,要用 qrcode.Write + bytes.Buffer。
典型写法:
buf := &bytes.Buffer{}
err := qrcode.Write(buf, qrcode.Low, 128, "data:text/plain,hello")
然后在 handler 中:
w.Header().Set("Content-Type", "image/png")
w.WriteHeader(http.StatusOK)
buf.WriteTo(w)
容易踩的坑:
-
qrcode.Write第一个参数必须是io.Writer,不是*bytes.Buffer—— 虽然*bytes.Buffer实现了它,但传参时别漏掉取地址符&(除非你传的是变量名而非字面量) - 如果内容含中文,确保编码为 UTF-8 字节流(Go string 默认就是),不用额外转码
- 并发场景下,
bytes.Buffer非线程安全,每次请求必须新建实例
生成带 Logo 的二维码:go-qrcode 不直接支持,得手动合成
这个需求很常见,但 skip2/go-qrcode 没提供 overlay 接口。你得自己用 image/draw 把 logo 图片贴到二维码中心。
关键步骤:
- 先用
qrcode.Encode得到二维码图像(*image.RGBA) - 打开 logo 图片(建议 PNG,带透明通道),缩放到合适大小(通常不超过二维码边长的 25%)
- 计算居中坐标:
(qr.Width()-logo.Bounds().Dx())/2,然后用draw.Draw贴上去
注意:Logo 太大会破坏定位图案(三个角上的“回”字),导致扫码失败;太小又看不清。建议留白至少 4 模块宽度做 quiet zone,否则部分扫码器会拒识。
没有自动避让算法,所有位置、缩放、透明度都得自己算——这也是为什么很多项目最终转向 rsc/qr 或加一层图形库封装。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











