我正在尝试从一系列任意非调色图像中创建动画GIF。为了创建一个调色板图像,我需要以某种方式提出一个调色板。
// RGBA, etc. images from somewhere else
var frames []image.Image
outGif := &gif.GIF{}
for _, simage := range(frames) {
// TODO: Convert image to paletted image
// bounds := simage.Bounds()
// palettedImage := image.NewPaletted(bounds, ...)
// Add new frame to animated GIF
outGif.Image = append(outGif.Image, palettedImage)
outGif.Delay = append(outGif.Delay, 0)
}
gif.EncodeAll(w, outGif)
Golang stdlib有一个简单的方法来实现这个目标吗?
答案 0 :(得分:4)
您也可以使用预定义的(https://golang.org/pkg/image/color/palette/)
,而不是生成自己的调色板...
palettedImage := image.NewPaletted(bounds, palette.Plan9)
draw.Draw(palettedImage, palettedImage.Rect, simage, bounds.Min, draw.Over)
...
答案 1 :(得分:3)
golang stdlib似乎缺少一种智能生成调色板的自动方式(如果我错了,请纠正我)。但似乎存在提供您自己Quantizer
的存根,这导致我进入gogif
项目。 (这是image.Gif
的明显来源。)
我能够从该项目中借用MedianCutQuantizer
,在此定义:
https://github.com/andybons/gogif/blob/master/mediancut.go
结果如下:
var subimages []image.Image // RGBA, etc. images from somewhere else
outGif := &gif.GIF{}
for _, simage := range(subimages) {
bounds := simage.Bounds()
palettedImage := image.NewPaletted(bounds, nil)
quantizer := gogif.MedianCutQuantizer{NumColor: 64}
quantizer.Quantize(palettedImage, bounds, simage, image.ZP)
// Add new frame to animated GIF
outGif.Image = append(outGif.Image, palettedImage)
outGif.Delay = append(outGif.Delay, 0)
}
gif.EncodeAll(w, outGif)