加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

go语言制作一个gif动态图

发布时间:2020-12-16 19:32:53 所属栏目:大数据 来源:网络整理
导读:如题,关键不是图怎么样,而是说,go可以拿来实现动态图验证码,加上go支持cgi、fcgi,完全可以做个exe拿去增补现有的服务器么。 ball.go package mainimport ( "github.com/hydra13142/cube" "github.com/hydra13142/geom" "github.com/hydra13142/paint" "

如题,关键不是图怎么样,而是说,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,10})).Unit()
  unx = cube.OuterProduct(uny,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,20)
  img := paint.Image{
    FR: paint.Green,BG: paint.White,}
  stp := dxy / 20
  delay := make([]int,20)
  for t := 0; t < 20; t++ {
    img.Image = image.NewPaletted(image.Rect(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+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.Vector{2,2,1})
  uny = cube.FromTo(cube.Point{},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,}
  stp := math.Pi / W
  delay := make([]int,2*W)
  for t := 0; t < 2*W; t++ {
    img.Image = image.NewPaletted(image.Rect(0,600,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),300+int(y[i][j-1].X),150-int(y[i][j-1].Y),)
        img.Line(
          300+int(y[i][j].X),300+int(y[i+1][j].X),_ := os.Create("woniu.gif")
  defer file.Close()
  gif.EncodeAll(file,})
}

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,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,z}
  }
  pics := make([]*image.Paletted,}
  stp := math.Pi * 2 / (W * 3)
  delay := make([]int,3*W)
  for t := 0; t < 3*W; t++ {
    img.Image = image.NewPaletted(image.Rect(0,palette.Plan9)
    for i := 0; i <= H*W; i++ {
      ox := cube.FromTo(cube.Point{},x[i])
      y[i] = geom.Point{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,8)
  }
  file,_ := os.Create("rotate.gif")
  defer file.Close()
  gif.EncodeAll(file,})
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读