为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
月关宝盒 2021-12-20 15:42:44
我正在尝试从一系列任意的非调色板图像创建动画 GIF。为了创建调色板图像,我需要以某种方式想出一个调色板。// RGBA, etc. images from somewhere elsevar frames []image.ImageoutGif := &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 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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


查看完整回答
反对 回复 2021-12-20
?
ibeautiful

TA贡献1993条经验 获得超6个赞

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


...

palettedImage := image.NewPaletted(bounds, palette.Plan9)

draw.Draw(palettedImage, palettedImage.Rect, simage, bounds.Min, draw.Over)

...


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 529 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号