如何把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)
...
我正在尝试从一系列任意的非调色板图像创建动画 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)
...