猿问

如何将 image.RGBA (image.Image) 转换为 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 中是否有一种简单的方法来实现这一点?


月关宝盒
浏览 530回答 2
2回答

翻翻过去那场雪

golang stdlib 似乎缺少一种智能生成调色板的自动方法(如果我在这里错了,请纠正我)。但是似乎有一个提供您自己的 stub 的存根Quantizer,这使我参与了该gogif项目。(这是 的明显来源image.Gif。)我能够MedianCutQuantizer从该项目中借用,定义如下:https://github.com/andybons/gogif/blob/master/mediancut.go结果如下:var subimages []image.Image // RGBA, etc. images from somewhere elseoutGif := &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)

ibeautiful

除了生成自己的调色板,您还可以使用预定义的 ( https://golang.org/pkg/image/color/palette/ )...palettedImage := image.NewPaletted(bounds, palette.Plan9)draw.Draw(palettedImage, palettedImage.Rect, simage, bounds.Min, draw.Over)...
随时随地看视频慕课网APP

相关分类

Go
我要回答