Golang覆盖图像始终是黑白的。

huangapple go评论95阅读模式
英文:

Golang Overlay image always black and white

问题

我正在尝试在二维码图像上添加叠加层。问题是我的原始叠加层图像是彩色的,但最终结果是黑白的。以下是代码:

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

有人可以帮我解决这个问题吗?
Golang覆盖图像始终是黑白的。

使用的图像

英文:

I am trying to put an overlay on qrcode(image). The problem is my original overlay image is colored but the end result is black and white. Below is the code:

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

Can someone please help me here?
Golang覆盖图像始终是黑白的。

Image Used

答案1

得分: 2

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码图像,然后再进行叠加。

英文:

QR code images use 2 colors which makes them easier to scan / recognize. The library you're using github.com/skip2/go-qrcode creates paletted images that use 2 colors only (black and white by default). You can check the source code of QRCode.Image() method you're calling, source here:

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

This means whatever you draw on such images, color for each pixel will be chosen from this 2-sized palette (either back or white). The color information of the drawn image will be lost.

If you want to retain all the colors, you must create an image that supports all (or at least the used) colors, draw the QR code image on that, and then the overlay.

答案2

得分: 0

我的工作也需要它。所以我从 @icza 这里总结了一下:

resultImg := image.NewRGBA(qrImg.Bounds())
overlayLogo(resultImg, qrImg)
overlayLogo(resultImg, logo)

这样我们就得到了带有标志的 QR 码的 resultImg。

英文:

My work needs it too. So from @icza I summarized :-

resultImg := image.NewRGBA(qrImg.Bounds())
overlayLogo(resultImg, qrImg)
overlayLogo(resultImg, logo)

So we get the resultImg, QR code with logo.

huangapple
  • 本文由 发表于 2021年8月30日 18:07:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/68982301.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定