LoginSignup
2
0

More than 3 years have passed since last update.

GoでランダムなGif画像を生成する

Posted at

この記事はtomowarkar ひとりAdvent Calendar 2019の22日目の記事です。

はじめに

GoでのGIF画像生成を調べてもあまり出てこなかったので書いてみます。

👇実際の生成物
スクリーンショット 2019-12-22 16.04.44.png

本記事には関係ないですが、image.Imageからimage.Palettedに変換する方法って何かいい方法ありませんかね...

考えかた

  • Intのスライスを生成する
  • 数字に対応する色をマッピングする
  • マッピングした画像を複数作り、GIFにする

Int スライス

スクリーンショット 2019-12-22 16.04.44.png

マッピング

スクリーンショット 2019-12-22 16.04.44.png

コード

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0