You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中二维码叠加彩色Logo后生成图片始终为黑白的问题求助

问题:二维码叠加彩色Logo后显示为黑白

我尝试在生成的二维码图片上叠加一张彩色Logo,但最终输出的图片里Logo变成了黑白的。以下是我的Go代码实现:

func (e Encoder) Encode(str string, logo image.Image, size int) (*bytes.Buffer, error) {
 var buf bytes.Buffer
 code, err := qr.New(str, e.QRLevel)
 if err != nil {
 return nil, err
 }
 img := code.Image(size)
 e.overlayLogo(img, logo)
 err = png.Encode(&buf, img)
 if err != nil {
 return nil, err
 }
 return &buf, nil
}

func (e Encoder) overlayLogo(dst, src image.Image) {
 offset := dst.Bounds().Max.X/2 - src.Bounds().Max.X/2
 yOffset := dst.Bounds().Max.Y/2 - src.Bounds().Max.Y/2
 draw.Draw(dst.(draw.Image), dst.Bounds().Add(image.Pt(offset, yOffset)), src, image.Point{}, draw.Over)
}

解决方案

嘿,我来帮你搞定这个问题~

问题根源

你遇到的核心问题是:二维码库生成的img是灰度图像(image.Gray类型),而你的彩色Logo是RGBA或其他彩色图像格式。当你直接把彩色图像绘制到灰度画布上时,Go的draw包会自动将彩色像素转换为灰度值,导致Logo丢失色彩信息,变成黑白。

修复步骤

我们需要先创建一个彩色的RGBA画布,把二维码先绘制到这个彩色画布上,再叠加彩色Logo,最后编码这个彩色画布即可保留Logo的颜色。

修改后的完整代码

import (
 "image"
 "image/draw"
 "image/png"
 "bytes"
 "github.com/skip2/go-qrcode" // 假设你使用的是这个常用二维码库
)

func (e Encoder) Encode(str string, logo image.Image, size int) (*bytes.Buffer, error) {
 var buf bytes.Buffer
 code, err := qrcode.New(str, e.QRLevel)
 if err != nil {
 return nil, err
 }
 // 生成二维码灰度图
 grayImg := code.Image(size)
 // 创建与二维码尺寸一致的RGBA彩色画布
 rgbaImg := image.NewRGBA(grayImg.Bounds())
 // 将灰度二维码绘制到彩色画布上
 draw.Draw(rgbaImg, rgbaImg.Bounds(), grayImg, image.Point{}, draw.Src)
 // 在彩色画布上叠加彩色Logo
 e.overlayLogo(rgbaImg, logo)
 // 编码彩色画布为PNG(保留色彩)
 err = png.Encode(&buf, rgbaImg)
 if err != nil {
 return nil, err
 }
 return &buf, nil
}

func (e Encoder) overlayLogo(dst draw.Image, src image.Image) {
 bounds := dst.Bounds()
 // 计算Logo居中的偏移量
 xOffset := bounds.Max.X/2 - src.Bounds().Max.X/2
 yOffset := bounds.Max.Y/2 - src.Bounds().Max.Y/2
 // 绘制Logo到彩色画布上
 draw.Draw(dst, bounds.Add(image.Pt(xOffset, yOffset)), src, image.Point{}, draw.Over)
}

关键修改点

  1. 创建彩色画布:用image.NewRGBA生成和二维码尺寸相同的彩色画布,替代原来的灰度图像作为绘制目标。
  2. 迁移绘制目标:把二维码和Logo都绘制到RGBA画布上,确保色彩信息不会被自动转换。
  3. 优化参数类型:修改overlayLogo的dst参数类型为draw.Image,避免不必要的类型断言(image.RGBA本身就实现了draw.Image接口)。

这样修改后,生成的PNG图片就能完整保留Logo的原始彩色啦!

内容的提问来源于stack exchange,提问作者Kumar Swapnil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:32:33