この記事はtomowarkar ひとりAdvent Calendar 2019の22日目の記事です。
はじめに
GoでのGIF画像生成を調べてもあまり出てこなかったので書いてみます。
本記事には関係ないですが、image.Image
からimage.Paletted
に変換する方法って何かいい方法ありませんかね...
考えかた
-
Int
のスライスを生成する - 数字に対応する色をマッピングする
- マッピングした画像を複数作り、GIFにする
Int スライス
マッピング
コード
package main
import (
"image"
"image/color"
"image/gif"
"math/rand"
"os"
)
func main() {
var w, h, scale, delay = 8, 5, 100, 100
var items [][]int
var palette = []color.Color{
color.RGBA{255, 0, 255, 255},
color.RGBA{0, 255, 255, 255},
color.RGBA{255, 255, 0, 255},
}
for i := 0; i < 5; i++ {
items = append(items, generateItem(w, h, len(palette)))
}
generateGif(w, h, scale, delay, items, "hoge", palette)
}
func generateItem(w, h, nums int) []int {
var item []int = make([]int, w*h)
for i := 0; i < w*h; i++ {
item[i] = rand.Intn(nums)
}
return item
}
func generateGif(w, h, scale, delay int, items [][]int, filename string, palette []color.Color) {
var images []*image.Paletted
var delays []int
for i := 0; i < len(items); i++ {
img := image.NewPaletted(image.Rect(0, 0, w*scale, h*scale), palette)
images = append(images, img)
delays = append(delays, delay)
for x := 0; x < w*scale; x++ {
for y := 0; y < h*scale; y++ {
img.Set(x, y, palette[items[i][y/scale*w+x/scale]%len(palette)])
}
}
}
f, _ := os.OpenFile(filename+".gif", os.O_WRONLY|os.O_CREATE, 0600)
defer f.Close()
gif.EncodeAll(f, &gif.GIF{
Image: images,
Delay: delays,
})
}
おわりに
カレンダーも残り数日ですね
以上明日も頑張ります!!
tomowarkar ひとりAdvent Calendar Advent Calendar 2019
参考
https://golang.org/pkg/image/gif/
https://gist.github.com/nitoyon/10108182cc0c12f54878