github.com/skip2/go-qrcode 是最轻量无依赖的二维码生成库,支持 png 输出、utf-8 中文、纠错等级设置及命令行工具;不支持透明背景与 logo,需手动处理图像叠加与颜色定制。

用 github.com/skip2/go-qrcode 生成基础二维码
这个库最轻量、无依赖,适合大多数简单场景。直接 go get github.com/skip2/go-qrcode 就能用,生成 PNG 最常用。
常见错误是忽略 qrcode.WriteFile() 的尺寸参数——传 256 表示“最小边长为 256 像素”,不是固定宽高;实际输出会因内容长度自动调整纠错等级和模块大小,最终图像可能略大于该值。
- 内容含中文时必须确保字符串是 UTF-8 编码(Go 字符串默认就是,但若从文件或网络读取,需确认没有 BOM 或乱码)
- 不支持透明背景,输出始终是白底黑码;如需透明,得用
qrcode.Encode()拿到*image.NRGBA后手动处理 - 默认使用
qrcode.Medium纠错等级(约 15% 容错),短文本够用;长链接或关键数据建议显式传qrcode.High
err := qrcode.WriteFile("https://example.com", qrcode.Medium, 256, "qrcode.png")
if err != nil {
log.Fatal(err)
}
给二维码叠加 Logo(中心留白 + 图像合成)
原生 go-qrcode 不提供 logo 功能,得自己裁剪中心区域再贴图。关键不是“怎么贴”,而是“贴完别毁掉定位图案”——QR 码三个角上的“回”字形定位框(finder pattern)绝对不能被遮盖。
实操中建议:先用 qrcode.Encode() 得到原始图像,再用 image/draw 裁出中间约 25%–30% 区域(例如 256×256 图上裁 64×64 正方形),缩放 logo 填入,最后用 draw.Draw 覆盖回去。
- 裁剪区域必须避开左上、右上、左下三个角落各约 40px(以 256px 图为例),否则扫码器大概率失败
- logo 图像建议用纯黑白色或高对比度,避免灰度干扰二值化识别
- 不要用
jpeg格式保存带 logo 的二维码——压缩会模糊边缘,改用png
命令行工具快速生成(无需写完整 main)
如果你只是偶尔生成几个码,不用写项目,直接装个可执行命令更省事:go install github.com/skip2/go-qrcode/cmd/qrcode@latest,之后就能:
qrcode -s 300 -o qr.png "Hello World" qrcode -l H -o wifi.png "WIFI:S:MyHome;T:WPA;P:12345678;;"
注意 -l 参数指定纠错等级(L/M/Q/H),-s 是最小尺寸。Wi-Fi 连接串这类结构化内容,必须严格按规范拼接,多一个分号或少一个引号都会扫不出。
- Windows 下如果提示“不是内部或外部命令”,检查
GOBIN是否在系统 PATH 中(默认是$HOME/go/bin) - 输入含空格或特殊字符时,整个字符串必须用英文双引号包裹,否则 shell 会截断
- 该命令不支持 logo,真要加图还得写几行 Go 代码
生成带样式/颜色的二维码(换色 & 圆角模块)
go-qrcode 只输出黑白,要改颜色或圆角,得换库或自己画。推荐 github.com/qrcode/gqr ——它返回的是矢量路径(SVG)或可定制的 *image.Image,方便二次加工。
它的核心是 gqr.New() 和 gqr.WithColor(),但要注意:颜色只影响模块(黑色块),背景色仍需手动填充;圆角需调用 gqr.WithRoundModule() 并传半径比例(如 0.2 表示模块宽度的 20%)。
- SVG 输出适合网页嵌入或设计稿导出,但体积比 PNG 大,别直接用在移动端资源里
- 自定义颜色后务必测试主流扫码 App(微信、支付宝、iOS 相机),部分旧版本对非黑白对比度敏感
- 圆角半径超过 0.3 会导致模块粘连,解码失败率明显上升
真正难的不是生成,是生成后立刻验证能不能扫出来——尤其加了 logo 或调了颜色的,最好用真机扫三台不同品牌手机再交付。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











