github.com/boombuler/barcode 是 Go 中生成条形码最稳选择,轻量无 CGO,支持主流格式,输出 *image.NRGBA;需注意黑底白字、手动 Scale、EAN/UPC 长度校验及 quiet zone 规范。

用 github.com/boombuler/barcode 生成条形码最稳
直接上结论:Go 原生不支持条形码,github.com/boombuler/barcode 是目前最轻量、无 CGO、兼容性最好的选择。它支持 Code128、EAN-13、UPC-A、ITF 等主流格式,输出 *image.NRGBA,可直接写入 PNG/JPEG。
常见踩坑点:barcode.Encode 返回的图像默认是黑底白字(反直觉),且尺寸单位是“像素点”,不是“毫米”或“英寸”。如果生成后扫码失败,大概率是宽高比例不对或 quiet zone(空白边距)太小。
- 必须手动调用
barcode.Scale拉伸到合理尺寸(比如 300×100),否则默认输出可能只有 20px 高,手机扫不出 - EAN-13/UPC-A 要求输入字符串严格为数字且长度固定(12 或 13 位),少一位或多一位都会 panic
- 生成后记得用
png.Encode写出,别直接 fmt.Println 图像对象——那只会打一串内存地址
用 github.com/skip2/go-qrcode 生成二维码更简单
github.com/skip2/go-qrcode 是 Go 社区事实标准,API 极简,一行就能出图。它底层纯 Go 实现,无依赖,支持纠错等级(qrcode.Low 到 qrcode.High)和自定义尺寸。
容易忽略的关键点:默认输出是 256×256 的 PNG,但实际内容区域只占中间一块,周围是 quiet zone(必须保留)。如果强行用 image.SubImage 裁掉白边,扫码器大概率失败。
- 用
qrcode.Encode时,第二个参数是 size(整数),指整个图像宽高(含 quiet zone),不是“内容区大小” - 纠错等级选
qrcode.Medium最平衡;Low容错差,High会让码变“毛糙”,部分老旧扫码枪识别率反而下降 - 中文内容要先 UTF-8 编码再传入,否则生成的二维码乱码——
qrcode.Encode(string([]byte(text)), ...)不行,得用qrcode.Encode(text, ...),库内部已处理
同时生成条形码+二维码并合成一张图?用 image.Draw 拼接
没有现成“条码+二维码合一”的库,但 Go 的 image 标准库足够应付拼接需求。核心是把两个 *image.NRGBA 当作图层,用 draw.Draw 叠加。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
注意坐标系原点在左上角,Y 轴向下增长。如果条形码在上、二维码在下,二维码的 image.Point Y 值得设为 条形码高度 + 间距。
- 两个图必须同为
*image.NRGBA类型,barcode.Generate返回的是image.Image,需显式转:img := barcode.BlackWhiteModel().Convert(barcodeImg) - 合成前建议统一背景为白色:
draw.Draw(dst, dst.Bounds(), image.White, image.Point{}, draw.Src),避免叠加后出现黑块 - 合成后保存 PNG 时,务必用
png.Encode,别用jpeg.Encode——JPEG 有损压缩会模糊边缘,导致扫码失败
生成的码扫不出来?优先检查 quiet zone 和 DPI
90% 的扫码失败不是代码问题,而是输出图像不符合规范。条形码要求左右 quiet zone ≥10×最小模块宽度,二维码要求四周 quiet zone ≥4×最小模块(即“quiet zone 至少 4 个点”)。
另一个隐藏雷区:生成时设了 size=200,但最终显示在网页里被 CSS 缩放成 100px,物理 DPI 下降,模块变糊。真机扫码时,这比算法错误更致命。
- 用
identify -format "%wx%h %x DPI" your.png(ImageMagick)查实际 DPI;打印场景建议输出 300 DPI PNG,宽高至少 500px - 条形码若用于超市扫描,优先用
barcode.Code128,别用Code39(后者需要起止符,易被误切) - 测试阶段别只用手机相册扫码,换几个不同型号手机 + 微信/支付宝/专用扫码枪实测——它们对 contrast、sharpness 敏感度差异很大
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










