I want to repeatedly rotate an image in a loop, in order to create a GIF, using Go's various image processing tools, but I can't seem to figure out what I'm doing wrong. Here, Gwenview reports that the GIF produced is not animated, and contains only one frame.
package main
import (
"image"
"image/color/palette"
"image/color"
"image/gif"
"image/draw"
"io"
"os"
"github.com/disintegration/imaging"
)
func main() {
rotate(os.Stdout)
}
func rotate(out io.Writer) {
f, _ := os.Open("myimage.png")
defer f.Close()
base, _, _ := image.Decode(f)
const (
rot = 45 // degrees
nframes = 5 // number of animation frames
delay = 20 // delay between frames in 10ms units
)
bounds := base.Bounds()
anim := gif.GIF{LoopCount: nframes}
for i := 0; i < nframes; i++ {
img := imaging.Rotate(base, float64(360 - (rot * i)), color.Transparent)
bounds = img.Bounds()
palettedImg := image.NewPaletted(bounds, palette.Plan9)
draw.Draw(palettedImg, bounds, img, bounds.Min, draw.Src)
anim.Delay = append(anim.Delay, delay)
anim.Image = append(anim.Image, palettedImg)
}
gif.EncodeAll(out, &anim) // NOTE: ignoring encoding errors
}