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

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

阅读剩余 82%

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

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

相关推荐

  • 语言(逅怎么读)

    引 言吴语是汉语族的一个重要分支,分布在江苏南部、浙江省大部、上海市全境,安徽南部及福建、江西的小部分地区。学术界将其分爲太湖片、台州片、东瓯片、婺州片、处衢片、宣州片六个小片。其…

  • 语言的谋略(洛邑怎么读)

    第十七辑 国家政策辩论的谋略与技巧文/钟百超 每个人对一定事物或做法都有自己的主见,而这个主见的形成与个人的信仰、理念、知识、修养,乃至利益都有密切相关。一个人能否提出一个有利于国…

  • 怎么以正确的方式替换Go语言程序自身

    Go语言是一门越来越受欢迎的编程语言,其致力于简化开发过程并提高编译速度。与其他编程语言相比,Go语言具有更好的并发性和易读性。在Go语言中,替换自己是一个常见的模式。在此文中,我…

  • Go语言中interface类型怎么使用

    Go语言中interface类型的定义 在Go语言中,interface类型是一个抽象的类型,它是一组方法签名的集合,只要某个类型实现了这些方法,它就属于该interface类型。…

  • Go语言中怎么实现代码跳转

    一、基本概念 在Go语言中,代码跳转是指从一个位置跳转到另一个位置。一般而言,我们可以通过函数调用进行代码跳转,也可以通过goto语句进行跳转。不同的跳转方式有不同的适用场景。 二…

  • Go语言中slice的反转方法怎么使用

    1.使用for循环和切片的索引 最基本的反转方法是使用for循环和切片的索引,遍历切片并将每个元素逆序放置。具体实现代码如下: func reverseSlice1(s&…

  • 怎么在Go语言中实现锁机制

    Go语言的锁 在Go语言中,最常用的锁是互斥锁(Mutex)。互斥锁是一种特殊的二进制信号量,用于控制对共享资源的访问。Go语言通过标准库中的"sync"包提供…

  • Go语言中的next()方法怎么使用

    在许多编程语言中,序列是一种基本的数据结构。序列是有序的元素集合,并且序列中的元素可以通过索引访问。有时,在遍历序列时需要对序列中的每个元素一次进行操作。对于这种情况,就可以使用n…

  • Linux系统中怎么安装NSQ的Go语言客户端

    一、安装Go语言环境 在安装NSQ前,需先安装Go语言环境。在Linux系统中安装Go语言环境的步骤如下: 1.下载安装包官方网站https://golang.org/dl/提供了…

  • Go语言中怎么使用HTTPS协议进行请求

    一、简介 HTTPS是HTTP协议加密版,用于保护传输数据的安全。HTTPS协议基于TLS/SSL协议完成,其最新的版本是TLS1.3。在HTTPS协议下,服务器端的数字证书可以检…

发表回复

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

分享本页
返回顶部