这篇文章主要介绍了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),
 - })
 - }
 
以上就是本文的全部内容了,希望大家能够喜欢。
新闻热点
疑难解答