Go 如何将image.RGBA(image.image)转换为image.paleted?

Go 如何将image.RGBA(image.image)转换为image.paleted?,go,gif,animated-gif,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() // p

我正在尝试从一系列任意非调色板图像创建动画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中似乎缺少一种自动生成调色板的方法(如果我在这里出错,请纠正我)。但是似乎有一个存根提供您自己的
量化器
,这让我想到了
gogif
项目。(这显然是
image.Gif
的来源)

我能够从该项目借用
MedianCutQuantizer
,定义如下:

其结果如下:

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)

除了生成自己的调色板之外,您还可以使用预定义的()


是我还是这个draw.draw函数需要很多时间才能执行!有什么解决办法吗?对于GIF,我尝试使用多个goroutine来编码我的GIF,但是这个draw函数是一个瓶颈@ShubhamSharma我在Mac上也经历过同样的经历Pro@ShubhamSharma我也有同样的问题。事实证明,调色板可以对Draw中的性能产生巨大影响。在下面的调色板中使用Taylor Hughes答案中的gogif.MedianCutQuantizer给了我很大的加速。你可以将量化器移出循环,它除了NumColor之外不包含任何状态,所以你不需要每次迭代都创建一个新的。这是在你提出问题之后创建的,但Eric Pauley的量化器是一个很好的工具。
...
palettedImage := image.NewPaletted(bounds, palette.Plan9)
draw.Draw(palettedImage, palettedImage.Rect, simage, bounds.Min, draw.Over)
...