qrcode.Encode 返回 *image.RGBA 对象而非 PNG 字节流,需用 png.Encode 编码;忽略 error、尺寸非法、纠错等级误用常量、中文兼容性、URL 编码未解码、Content-Type 未前置设置、HTTPS 混合内容及颜色自定义需手动像素操作。

qrcode.Encode 返回的不是 PNG,是 *image.RGBA
很多人一上来就 qrcode.Encode,拿到返回值直接 fmt.Println 或塞进 w.Write,结果看到内存地址或一堆乱码——因为它的返回值是 Go 的图像对象 *image.RGBA,不是字节流,更不是 PNG 文件。
- 必须用
png.Encode手动编码:先os.Create("q.png")或传http.ResponseWriter,再png.Encode(f, img) - 忽略
error是高频崩溃点:比如路径含中文、父目录不存在、文件正被看图软件占用,都会导致png.Encode失败但无提示 - 尺寸参数是像素总数(如
256),不是“小中大”;传0或负数会 panic,传16基本扫不出来 - 纠错等级必须用常量:
qrcode.Low/qrcode.Medium,别传数字1或字符串"medium",否则行为异常且不报错
中文内容扫码失败?不是库的问题,是编码和兼容性问题
go-qrcode 本身只做 Base32 编码+点阵绘制,对 UTF-8 字符串完全支持。但微信旧版、部分终端扫码器对非 ASCII 内容解析弱,这不是 bug,是现实兼容性边界。
- 前端传参若经 URL 编码(如
text=https%3A%2F%2Fexample.com),后端必须先url.QueryUnescape,否则生成的是带%3A的错误链接 - 纯中文内容建议预处理:
url.QueryEscape("你好")再传给qrcode.Encode,提升各平台识别率 - 避免混用全角标点、不可见控制字符(如
\u200b),某些扫码器会截断或静默失败 - 校验输入是否合法 UTF-8:
utf8.Valid([]byte(s)),非法字节会触发qrcode: content contains invalid characters
HTTP API 中生成二维码,Content-Type 和顺序不能错
浏览器显示乱码、iOS Safari 不加载、微信内嵌页拒绝渲染——90% 是响应头没设对,而且必须在任何写操作之前设置。
- 务必在
png.Encode(w, img)前调用:w.Header().Set("Content-Type", "image/png") - 漏设或写在
w.Write后面,header 已隐式写出,设置无效 - 需要跨域时加:
w.Header().Set("Access-Control-Allow-Origin", "*")(生产环境请限定域名) - HTTPS 页面加载 HTTP 二维码资源会被 Chrome 拦截为 Mixed Content,服务端必须走 HTTPS 或反向代理
- 高并发下建议加缓存:
map[string][]byte存已生成的[]byte,key 用text + size + level拼接
想改颜色、加 logo?得自己动手画像素
go-qrcode 原生只输出黑白图像(黑点是 0x000000ff,白底是 0xffffffff)。所谓 “自定义颜色” 实际是遍历像素重绘,没有魔法开关。
立即学习“go语言免费学习笔记(深入)”;
-
qrcode.WithQRCodeColor等选项在 v1.4+ 已废弃,用了也静默失效 - 改前景色:遍历
img.Bounds(),对每个img.RGBAAt(x, y)判断是否接近黑色,再用img.SetRGBA(x, y, r 覆盖(注意 Go 的 <code>color.RGBA是 16 位分量) - 加 logo:用
draw.Draw把小图贴到中心区域,但必须避开三个定位角标(左上、右上、左下大方块),否则扫码失败 - 导出 JPEG?别试。PNG 支持透明,JPEG 强制转会导致黑底或色偏,坚持用 PNG
*image.RGBA 当成可直接传输的数据,以及忽略中文 URL 解码和响应头顺序。这两处一错,连最简单的 Hello World 都跑不通。


















