go语言制作一个gif动态图

 更新时间:2015年03月20日 15:10:24   投稿:hebedich  
这篇文章主要介绍了go制作一个gif动态图的相关资料,需要的朋友可以参考下

如题,关键不是图怎么样,而是说,go可以拿来实现动态图验证码,加上go支持cgi、fcgi,完全可以做个exe拿去增补现有的服务器么。

ball.go

package main
import (
  "github.com/hydra13142/cube"
  "github.com/hydra13142/geom"
  "github.com/hydra13142/paint"
  "image"
  "image/color/palette"
  "image/gif"
  "math"
  "os"
)
var (
  pln *cube.Plain
  unx cube.Vector
  uny cube.Vector
)
const (
  H = 18
  W = 36
)
func init() {
  pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{4, 4, 3})
  uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit()
  unx = cube.OuterProduct(uny, cube.Vector{4, 4, 3}).Unit()
}
func main() {
  var x [H + 1][W]cube.Point
  var y [H + 1][W]geom.Point
  dz := math.Pi / H
  dxy := math.Pi * 2 / W
  for i := 0; i <= H; i++ {
    az := float64(i)*dz - math.Pi/2
    r := 140 * math.Cos(az)
    z := 140 * math.Sin(az)
    for j := 0; j < W; j++ {
      axy := float64(j) * dxy
      x[i][j] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z}
    }
  }
  pics := make([]*image.Paletted, 0, 20)
  img := paint.Image{
    FR: paint.Green,
    BG: paint.White,
  }
  stp := dxy / 20
  delay := make([]int, 0, 20)
  for t := 0; t < 20; t++ {
    img.Image = image.NewPaletted(image.Rect(0, 0, 300, 300), palette.Plan9)
    for i := 0; i <= H; i++ {
      for j := 0; j < W; j++ {
        ox := cube.FromTo(cube.Point{}, x[i][j])
        y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)}
        a, b := x[i][j].X, x[i][j].Y
        x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp)
        x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp)
      }
    }
    for i := 0; i < H; i++ {
      for j := 0; j < W; j++ {
        img.Line(
          150+int(y[i][j].X),
          150-int(y[i][j].Y),
          150+int(y[i][(j+1)%W].X),
          150-int(y[i][(j+1)%W].Y),
        )
        img.Line(
          150+int(y[i][j].X),
          150-int(y[i][j].Y),
          150+int(y[i+1][j].X),
          150-int(y[i+1][j].Y),
        )
      }
    }
    pics = append(pics, img.Image.(*image.Paletted))
    delay = append(delay, 5)
  }
  file, _ := os.Create("ball.gif")
  defer file.Close()
  gif.EncodeAll(file, &gif.GIF{
    Image:   pics,
    Delay:   delay,
    LoopCount: 5 * len(delay),
  })
}

woniu.go

package main
import (
  "github.com/hydra13142/cube"
  "github.com/hydra13142/geom"
  "github.com/hydra13142/paint"
  "image"
  "image/color/palette"
  "image/gif"
  "math"
  "os"
)
var (
  pln   *cube.Plain
  unx, uny cube.Vector
)
const (
  H = 18
  W = 96
)
func init() {
  pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{2, 2, 1})
  uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit()
  unx = cube.OuterProduct(uny, cube.Vector{2, 2, 1}).Unit()
}
func main() {
  var x [H + 1][W]cube.Point
  var y [H + 1][W]geom.Point
  dz := math.Pi / H
  dxy := math.Pi * 4 / W
  for i := 0; i <= H; i++ {
    az := float64(i)*dz - math.Pi/2
    r := 300 * math.Cos(az)
    z := 100 * math.Sin(az)
    for j := 0; j < W; j++ {
      axy := float64(j) * dxy
      R := float64(j) * r / W
      x[i][j] = cube.Point{math.Cos(axy) * R, math.Sin(axy) * R, z}
    }
  }
  pics := make([]*image.Paletted, 0, 20)
  img := paint.Image{
    FR: paint.Green,
    BG: paint.White,
  }
  stp := math.Pi / W
  delay := make([]int, 0, 2*W)
  for t := 0; t < 2*W; t++ {
    img.Image = image.NewPaletted(image.Rect(0, 0, 600, 300), palette.Plan9)
    for i := 0; i <= H; i++ {
      for j := 0; j < W; j++ {
        ox := cube.FromTo(cube.Point{}, x[i][j])
        y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)}
        a, b := x[i][j].X, x[i][j].Y
        x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp)
        x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp)
      }
    }
    img.Line(
      300+int(y[0][0].X),
      150-int(y[0][0].Y),
      300+int(y[H][0].X),
      150-int(y[H][0].Y),
    )
    for i := 0; i < H; i++ {
      for j := 1; j < W; j++ {
        img.Line(
          300+int(y[i][j].X),
          150-int(y[i][j].Y),
          300+int(y[i][j-1].X),
          150-int(y[i][j-1].Y),
        )
        img.Line(
          300+int(y[i][j].X),
          150-int(y[i][j].Y),
          300+int(y[i+1][j].X),
          150-int(y[i+1][j].Y),
        )
      }
    }
    pics = append(pics, img.Image.(*image.Paletted))
    delay = append(delay, 5)
  }
  file, _ := os.Create("woniu.gif")
  defer file.Close()
  gif.EncodeAll(file, &gif.GIF{
    Image:   pics,
    Delay:   delay,
    LoopCount: 5 * len(delay),
  })
}

rotate.go

package main
import (
  "github.com/hydra13142/cube"
  "github.com/hydra13142/geom"
  "github.com/hydra13142/paint"
  "image"
  "image/color/palette"
  "image/gif"
  "math"
  "os"
)
var (
  pln   *cube.Plain
  unx, uny cube.Vector
)
const (
  H = 9
  W = 36
)
func init() {
  pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{4, 4, 3})
  uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit()
  unx = cube.OuterProduct(uny, cube.Vector{4, 4, 3}).Unit()
}
func main() {
  var x [H*W + 1]cube.Point
  var y [H*W + 1]geom.Point
  dxy := (math.Pi * 2) / W
  dz := math.Pi / H
  for i := 0; i <= H*W; i++ {
    az := float64(i)*dz/W - math.Pi/2
    r := 140 * math.Cos(az)
    z := 140 * math.Sin(az) 
    axy := float64(i) * dxy
    x[i] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z}
  }
  pics := make([]*image.Paletted, 0, 20)
  img := paint.Image{
    FR: paint.Green,
    BG: paint.White,
  }
  stp := math.Pi * 2 / (W * 3)
  delay := make([]int, 0, 3*W)
  for t := 0; t < 3*W; t++ {
    img.Image = image.NewPaletted(image.Rect(0, 0, 300, 300), palette.Plan9)
    for i := 0; i <= H*W; i++ {
      ox := cube.FromTo(cube.Point{}, x[i])
      y[i] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)}
      a, b := x[i].X, x[i].Z
      x[i].X = a*math.Cos(stp) - b*math.Sin(stp)
      x[i].Z = b*math.Cos(stp) + a*math.Sin(stp)
    }
    img.Line(
      150+int(y[0].X),
      150-int(y[0].Y),
      150+int(y[H*W].X),
      150-int(y[H*W].Y),
    )
    for i := 0; i < H*W; i++ {
      img.Line(
        150+int(y[i].X),
        150-int(y[i].Y),
        150+int(y[i+1].X),
        150-int(y[i+1].Y),
      )
    }
    pics = append(pics, img.Image.(*image.Paletted))
    delay = append(delay, 8)
  }
  file, _ := os.Create("rotate.gif")
  defer file.Close()
  gif.EncodeAll(file, &gif.GIF{
    Image:   pics,
    Delay:   delay,
    LoopCount: 5 * len(delay),
  })
}

以上就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • 使用Gomock进行单元测试的方法示例

    使用Gomock进行单元测试的方法示例

    这篇文章主要介绍了使用Gomock进行单元测试的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • golang的httpserver优雅重启方法详解

    golang的httpserver优雅重启方法详解

    这篇文章主要给大家介绍了关于golang的httpserver优雅重启的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • GO语言的IO方法实例小结

    GO语言的IO方法实例小结

    这篇文章主要介绍了GO语言的IO方法实例小结,Docker的火爆促成了当下新兴的Go语言人气的大幅攀升,需要的朋友可以参考下
    2015-10-10
  • golang实现整型和字节数组之间的转换操作

    golang实现整型和字节数组之间的转换操作

    这篇文章主要介绍了golang实现整型和字节数组之间的转换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GoLang中生成UUID唯一标识的实现

    GoLang中生成UUID唯一标识的实现

    这篇文章主要介绍了GoLang中生成UUID唯一标识的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 如何在Go中使用切片容量和长度

    如何在Go中使用切片容量和长度

    这篇文章主要介绍了如何在Go中使用切片容量和长度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Golang学习之平滑重启

    Golang学习之平滑重启

    这篇文章主要介绍了Golang学习之平滑重启,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • golang之log rotate详解

    golang之log rotate详解

    下面小编就为大家带来一篇golang之log rotate详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • GO语言映射(Map)用法分析

    GO语言映射(Map)用法分析

    这篇文章主要介绍了GO语言映射(Map)用法,以实例形式较为详细的分析了针对映射的创建、填充、遍历及修改等操作的技巧,需要的朋友可以参考下
    2014-12-12
  • 浅谈Go语言中的次方用法

    浅谈Go语言中的次方用法

    这篇文章主要介绍了浅谈Go语言中的次方用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论