首页 > 解决方案 > Golang Overlay 图像总是黑白的

问题描述

我正在尝试在 qrcode(图像)上叠加。问题是我的原始叠加图像是彩色的,但最终结果是黑白的。下面是代码:

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)
}

有人可以在这里帮助我吗? 这是我得到的最终图像

使用的图像

标签: imagego

解决方案


QR 码图像使用 2 种颜色,使其更易于扫描/识别。您正在使用的库github.com/skip2/go-qrcode创建仅使用 2 种颜色(默认为黑色和白色)的调色板图像。您可以检查QRCode.Image()您正在调用的方法的源代码,来源

p := color.Palette([]color.Color{q.BackgroundColor, q.ForegroundColor})
img := image.NewPaletted(rect, p)

这意味着无论您在此类图像上绘制什么,每个像素的颜色都将从这个 2 大小的调色板(背面或白色)中选择。绘制图像的颜色信息将丢失。

如果要保留所有颜色,则必须创建一个支持所有(或至少是使用的)颜色的图像,在其上绘制 QR 码图像,然后进行叠加。


推荐阅读