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,}) } 以上就是本文的全部内容了,希望大家能够喜欢。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |