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),
  })
}

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

原创文章,作者:HMCVY,如若转载,请注明出处:https://www.beidanyezhu.com/a/26573.html

(0)
HMCVY的头像HMCVY
上一篇 2025-01-03
下一篇 2025-01-04

相关推荐

  • go语言有什么开发工具

    go语言开发工具有:1、GoLand;2、LiteIDE;3、Eclipse。LiteIDE是一款开源、跨平台的轻量级Go语言集成开发环境。 开发工具介绍: 1、GoLand Go…

    2025-01-07
  • go语言可以用哪些框架

    go语言使用的框架有:1、Beego框架;2、Buffalo框架;3、Echo框架;4、Gin框架;5、Iris框架;6、Revel框架。 6款好用的go语言web框架: Beeg…

  • go语言怎么引入包

    go语言引入包的方法:可以直接使用【import "包名"】来引入一个包。如果需要同时引入多个包,可以使用【import {"包名" &qu…

    2025-01-07
  • yum如何安装go语言

    yum安装go语言的方法:首先执行【yum -y install golang】命令安装go;然后编辑profile文件,配置环境变量;最后执行【source /etc/profi…

  • vscode如何配置go语言开发环境

    Golang 环境配置 1) 首先下载适合你系统的安装包 2)下载完成安装到指定目录即可。我这里是(D:\Go)。 3)配置Glang环境变量 进入我的电脑->高级设置-&g…

    2025-01-07
  • go语言defer怎么用

    go语言defer的用法:1、defer语句在函数返回之前或函数中的return语句之后执行;2、多个defer语句的执行顺序是逆序执行;3、在panic语句后的defer语句不执…

  • windows下如何搭建go语言开发环境

    windows下搭建go语言开发环境的方法:1、在官网下载go语言开发包;2、安装go语言开发包;3、设置GOPATH环境变量;4、测试go开发包是否安装成功。 具体步骤如下: 一…

    2025-01-07
  • go语言的7大优势是什么

    go语言的优势有:1、学习曲线容易;2、开发效率和运行效率高;3、自由高效;4、拥有强大的标准库;5、部署方便;6、高度支持并发性;7、稳定性高。 go语言的优势: 1、学习曲线容…

  • go语言指的是什么

    go语言是一种静态强类型、编译型语言,它的语法与C语言相近。go语言规定每行程序结束后不需要撰写分号,大括号不能够换行放置,if判断式和for循环不需要以小括号包裹。 详细介绍: …

  • go语言适合于什么领域

    go语言适用的领域有:1、服务器编程;2、分布式系统;3、网络编程;4、内存数据库;5、云平台;6、游戏服务端的开发。go语言是一种静态强类型、编译型语言。 Go(又称 Golan…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部