読者です 読者をやめる 読者になる 読者になる

アイコンをくるくる回すやつ

mattn さんの猫アイコンを回すやつ.

github.com

自分のアイコンも回してみたかったんだけど,減色の処理が端折られてたので悲しい感じに.gif アニメは256色(!)までしか使えないっぽいんだけど,こいつを web safe color に落とし込んでるのでどうしても色が崩れてしまう.

f:id:ikawaha:20150903100712g:plain:w100

Go言語で画像の減色を行う - Shogo's Blog

こちらを参考にさせてもらってちょっと調整.修正点はこれだけ.

   "flag"
    "image"
    "image/color"
-  "image/color/palette"
    "image/draw"
    "image/gif"
    _ "image/jpeg"
 @@ -15,6 +14,7 @@ import (
 
    "github.com/robfig/graphics-go/graphics"
    "github.com/robfig/graphics-go/graphics/interp"
+   "github.com/soniakeys/quant/median"
 )
 
 var (
 @@ -50,8 +50,9 @@ func main() {
    }
 
    limit := int(360 / 10 / (*speed))
+   p := median.Quantizer(256).Quantize(make(color.Palette, 0, 256), src)
    for i := 0; i < limit; i++ {
-      dst := image.NewPaletted(src.Bounds(), palette.WebSafe)
+       dst := image.NewPaletted(src.Bounds(), p)
        draw.Draw(dst, src.Bounds(), &image.Uniform{color.White}, image.ZP, draw.Src)
        err = graphics.Rotate(dst, src, &graphics.RotateOptions{Angle: base * float64(i)})
        if err != nil {
 @@ -59,7 +60,7 @@ func main() {
        }
        if *zoom {
            w, h := float64(src.Bounds().Dx()), float64(src.Bounds().Dy())
-          tmp := image.NewPaletted(src.Bounds(), palette.WebSafe)
+           tmp := image.NewPaletted(src.Bounds(), p)
            draw.Draw(tmp, src.Bounds(), &image.Uniform{color.White}, image.ZP, draw.Src)
            z := float64(0.5 + float64(i)/30.0)
            graphics.I.

github.com

うん,気持ち悪い.

https://raw.githubusercontent.com/ikawaha/nekokak/feature/color/animated.gif