如何把image.RGBA (image.Image) 转换成image.Paletted?

How to convert image.RGBA (image.Image) to image.Paletted?

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

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)

除了生成您自己的调色板,您还可以使用预定义的 (https://golang.org/pkg/image/color/palette/)

...
palettedImage := image.NewPaletted(bounds, palette.Plan9)
draw.Draw(palettedImage, palettedImage.Rect, simage, bounds.Min, draw.Over)
...