```go
package main
import (
"fmt"
"image"
"image/color"
"image/draw"
_ "image/gif"
_ "image/jpeg"
"image/png"
_ "image/png"
"log"
"os"
)
func main() {
img()
}
func img() {
// 打开二维码
qrcode, err := os.Open("./code1.png")
if err != nil {
fmt.Println("二维码打开失败:", err)
return
}
defer qrcode.Close()
// 将二维码文件解码成图片
qrImg, _, err := image.Decode(qrcode)
if err != nil {
fmt.Println("图片解码失败:", err)
}
// 获取二维码的宽高
width, height := qrImg.Bounds().Max.X, qrImg.Bounds().Max.Y
//qrImg.(*image.Paletted).Palette = append(qrImg.(*image.Paletted).Palette,color.RGBA{R:255,G:255,B:0,A:255})
// 打开要填充的图片
bgFile, err := os.Open("./bg.png")
if err != nil {
log.Fatalf("打开填充图失败 %s", err.Error())
return
}
defer bgFile.Close()
// 将填充图解码成png图片
bgImg, _, err := image.Decode(bgFile)
if err != nil {
log.Fatalf("填充图解码失败 %s", err.Error())
return
}
for i := 1; i <= width; i++ {
for j := 1; j <= height; j++ {
switch qrImg.(type) {
case *image.NRGBA:
qrImg.(draw.Image).Set(i, j, color.RGBA{R: 255, G: 255, B: 0, A: 255})
case *image.RGBA:
qrImg.(draw.Image).Set(i, j, color.RGBA{R: 255, G: 0, B: 0, A: 255})
case *image.Paletted:
qrColor := bgImg.At(i, j)
isExit := false
for _, v := range qrImg.(*image.Paletted).Palette {
if qrColor == v {
isExit = true
}
}
if !isExit {
qrImg.(*image.Paletted).Palette = append(qrImg.(*image.Paletted).Palette, qrColor.(color.NRGBA))
}
qrImg.(*image.Paletted).Set(i, j, qrColor.(color.NRGBA))
}
}
}
filename := fmt.Sprintf("%s.png", "2022")
// 写入文件
outFile, err := os.Create(filename)
if err != nil {
log.Fatal(err)
}
defer outFile.Close()
_ = png.Encode(outFile, qrImg)
}
```
以上代码,我想根据bg.png的颜色然后替换code1.png的颜色,code1.png的类型是*image.Paletted
之前调用set方法 然后保存之后,图片只有黑白两个颜色,后面经过群里面的大佬提醒,需要把要加的颜色,向 qrImg.(*image.Paletted).Palette 调色板里面添加颜色
按照这样修改之后能够修改code1.png的颜色了,但是我又发现,只要 qrImg.(*image.Paletted).Palette 里面的值超过256 就还是会生成不了图片
有大佬能帮我看看这个问题了 我在论坛 文档上面都找遍了 都没有描述这个问题的 , 谢谢了
有疑问加站长微信联系(非本文作者)