项目特殊需求,需要绘制类似photoshop的png-8格式的PNG图。在一篇帖子里找到了答案:
https://groups.google.com/forum/#!topic/golang-nuts/6ecoi0xh40M
最终指向了以下的解决方案:
https://play.golang.org/p/Sxl-nLnecy
这里附上代码:
package main
import (
"image"
"image/color/palette"
"image/draw"
"image/png"
"log"
"os"
"path"
)
func main() {
srcFile, err := os.Open(path.Join(os.Getenv("HOME"), "go/src/image/testdata/video-001.png"))
if err != nil {
log.Fatal(err)
}
defer srcFile.Close()
src, err := png.Decode(srcFile)
if err != nil {
log.Fatal(err)
}
dst := image.NewPaletted(src.Bounds(), palette.Plan9)
drawer := draw.Drawer(draw.Src)
drawer.Draw(dst, dst.Bounds(), src, src.Bounds().Min)
dstFile, err := os.Create("out.png")
if err != nil {
log.Fatal(err)
}
defer dstFile.Close()
err = png.Encode(dstFile, dst)
if err != nil {
log.Fatal(err)
}
}
具体原理,应该是用了palette.Plan9这个256种颜色的调色盘,重绘了图片。但是为什么保存结果变成8bit图,我没搞明白。