如何将image.RGBA(image.Image)转换为image.Paletted?

时间:2016-03-07 18:04:21

标签: go gif animated-gif

我正在尝试从一系列任意非调色图像中创建动画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有一个简单的方法来实现这个目标吗?

2 个答案:

答案 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)