英文:
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)
}
英文:
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)
}
答案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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论