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) }
关键修改点
- 创建彩色画布:用
image.NewRGBA生成和二维码尺寸相同的彩色画布,替代原来的灰度图像作为绘制目标。 - 迁移绘制目标:把二维码和Logo都绘制到RGBA画布上,确保色彩信息不会被自动转换。
- 优化参数类型:修改
overlayLogo的dst参数类型为draw.Image,避免不必要的类型断言(image.RGBA本身就实现了draw.Image接口)。
这样修改后,生成的PNG图片就能完整保留Logo的原始彩色啦!
内容的提问来源于stack exchange,提问作者Kumar Swapnil
相关产品推荐
相关产品推荐

