image - 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)
}
解决方案
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 码图像,然后进行叠加。
推荐阅读
- kubernetes - Kubernetes 外部 IP 不适用于所有节点
- django - 从一个模型中获取其他模型的 pk
- app-store - 如何在我的 Mac 上使用 AppStore 连接 API,在 WWDC18 中宣布?
- oracle - Raise_application_error() 会停止执行吗?(停止在表中插入/删除/更新)
- javascript - 承诺解决后如何加载 API 数据以响应组件?
- objective-c - Objective-C autoreleasepool 指令影响范围之外的变量。
- spring - Spring Data Rest 和集成测试
- javascript - 每月从 JavaScript 中的对象数组中求和值
- java - spring jdbcTemplate 批量更新返回记录插入
- recursion - 如何在可扩展记录上重复出现?