iris框架本身不内置二维码生成功能,需借助qrcode等第三方库将文本编码为*image.nrgba,再用png.encode转为字节流,设置content-type为"image/png"后通过ctx.write直接输出png图像流;支持自定义尺寸、纠错等级及logo叠加,但需注意纠错等级与尺寸匹配以保障扫码成功率。

Iris 框架本身不内置二维码生成功能,它是个 Go 语言的 Web 框架,专注 HTTP 路由、中间件、模板渲染等,生成二维码得靠第三方库配合使用。
常见做法是:用 qrcode(如 github.com/skip2/go-qrcode)或 golang-qrcode 类库生成图像字节,再通过 Iris 的 ctx.Write 或 ctx.ServeContent 直接输出 PNG/JPEG 流。不建议生成文件再读取——多一次磁盘 I/O,没必要。
怎么在 Iris 中返回二维码 PNG 图像
核心是把二维码画成 []byte,设好 Content-Type,直接写入响应体:
-
qrcode.Encode()返回*image.NRGBA,需用png.Encode()编码为字节流 - 务必设置
ctx.ContentType("image/png"),否则浏览器当文本渲染 - 避免用
ctx.JSON()或ctx.Text()包裹二进制数据——会损坏图像 - 若要支持自定义尺寸/纠错等级,传参给
qrcode.Encode()的第三个参数(如qrcode.Medium)
func generateQR(ctx iris.Context) {
text := ctx.URLParam("text")
if text == "" {
ctx.StatusCode(400)
ctx.WriteString("missing 'text' param")
return
}
png, err := qrcode.Encode(text, qrcode.Medium, 256)
if err != nil {
ctx.StatusCode(500)
ctx.WriteString("qrcode encode failed")
return
}
ctx.ContentType("image/png")
ctx.StatusCode(200)
ctx.Write(png)
}
为什么不能直接用 ctx.ServeFile 返回二维码文件
可以,但不推荐,除非你有缓存策略或 CDN 配合:
- 每次请求都生成新文件 → 磁盘 IO + 文件系统锁风险(尤其高并发)
- 临时文件清理麻烦,容易堆积(比如没加
os.Remove) - 文件路径暴露可能带来安全风险(如目录遍历)
- 不如内存中生成 + 直接流式响应快,延迟更可控
如何支持带 Logo 的二维码(Iris + 图像叠加)
Iris 不处理图像合成,得靠 golang.org/x/image/draw 和 image/png 手动叠加:
- 先用
qrcode.Encode()生成基础二维码*image.NRGBA - 用
draw.Draw()把 logo 图片缩放后贴到中心区域(注意留白,否则扫码失败) - 叠加前建议对 logo 做透明通道处理,避免遮盖关键模块
- 最终仍走
ctx.Write(pngBytes)输出,别试图用ctx.View()渲染
真正容易被忽略的是纠错等级和尺寸匹配:二维码太小或纠错太低(qrcode.Low),加了 logo 后大概率扫不出;而 qrcode.Highest 又会让图像变“密”,logo 边缘容易糊。实测 qrcode.Medium + 256×256 基础图 + logo 占比 ≤30% 最稳妥。











