go生成二维码报“invalid image format”根本原因是qrcode.encode默认写png但目标io.writer不支持,须显式指定qrcode.withimagetype;解码需gozxing等库,logo覆盖须避开定位图案,文件后缀须与withimagetype匹配。

Go 生成二维码时 qrcode.Encode 报错 “invalid image format”
根本原因是输出目标不支持写入 PNG/JPEG——比如你传了 os.Stdout 或一个没设置 io.Writer 的空 bytes.Buffer,而库默认尝试写 PNG。它不会自动帮你选格式,也不会 fallback。
- 必须显式指定图像格式:
qrcode.WithImageType(qrcode.ImageTypePNG)或qrcode.ImageTypeJPEG - 写入前确认目标
io.Writer支持二进制写入(os.Stdout在终端里会乱码,适合重定向到文件) - 别直接用
fmt.Println(img)打印返回的*image.NRGBA,那是像素数据,不是二维码图
解析图片中二维码:用 golang.org/x/image 读图 + github.com/skip2/go-qrcode 不行
go-qrcode 只负责生成,不带解码能力。想从图片提取二维码,得换库,主流是 github.com/boombuler/barcode 或更可靠的 github.com/makiuchi-d/gozxing(ZXing Go 移植版)。
-
gozxing支持常见格式(PNG/JPEG/BMP),但要求输入是*image.Gray;用image.Decode后需手动转灰度:image.NewGray(img.Bounds()).(*image.Gray) - 别跳过错误检查:
gozxing.NewBinaryBitmap和reader.Decode都可能返回nil,常见于模糊、反光、低对比度图 - 性能上,
gozxing解单图约 50–200ms,批量处理建议加 context 控制超时
生成带 Logo 的二维码:覆盖区域导致扫码失败
直接在二维码图像上 Draw 一个 logo 图片,很容易破坏定位图案(三个角上的大方块)或格式信息区(右上+左下小方块),扫码器就认不出来了。
bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置
- Logo 尺寸别超过二维码模块数的 20%(例如 300×300 二维码,logo 最好 ≤60×60)
- 优先覆盖中心区域,避开四角和右上/左下两处格式信息区(可查
qr.Code.Size()得模块总数,再算坐标) - 用
draw.DrawMask而非draw.Draw,避免 alpha 混合污染二维码黑白模块 - 生成后务必用手机真机扫一遍,模拟器或网页扫码器容错太强,容易误判
命令行工具里接收 URL 参数并生成文件:路径和扩展名要对齐
用户输 ./qrgen https://example.com -o out.jpg,结果生成的是 PNG 内容但后缀是 .jpg,手机相册打不开——因为 qrcode.Encode 默认只输出 PNG,不看文件后缀。
立即学习“go语言免费学习笔记(深入)”;
- 根据
-o参数后缀决定WithImageType:.png→qrcode.ImageTypePNG,.jpg或.jpeg→qrcode.ImageTypeJPEG - 写文件前用
os.Create,别用os.OpenFile(..., os.O_CREATE|os.O_WRONLY)忘加os.O_TRUNC,旧文件残留字节会导致损坏 - Windows 下注意路径分隔符,
filepath.Join比硬写"\"更稳
最常被忽略的是:二维码容错等级(qrcode.Low 到 qrcode.Highest)和尺寸(qrcode.WithSize(300))不匹配。小尺寸配 Highest 容错,模块太密,打印或截图后极易失效。调参前先想清楚使用场景——是贴在海报上?还是嵌在 App 界面里?









