博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用go写一个gif动态图
阅读量:6102 次
发布时间:2019-06-20

本文共 5228 字,大约阅读时间需要 17 分钟。

hot3.png

如题,关键不是图怎么样,而是说,go可以拿来实现动态图验证码,加上go支持cgi、fcgi,完全可以做个exe拿去增补现有的服务器么。

package mainimport ("github.com/hydra13142/cube""github.com/hydra13142/geom""github.com/hydra13142/paint""image""image/color/palette""image/gif""math""os")var (pln *cube.Plainunx cube.Vectoruny cube.Vector)const (H = 18W = 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.Pointvar y [H + 1][W]geom.Pointdz := math.Pi / Hdxy := math.Pi * 2 / Wfor i := 0; i <= H; i++ {az := float64(i)*dz - math.Pi/2r := 140 * math.Cos(az)z := 140 * math.Sin(az)for j := 0; j < W; j++ {axy := float64(j) * dxyx[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 / 20delay := 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].Yx[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),})}
package mainimport ("github.com/hydra13142/cube""github.com/hydra13142/geom""github.com/hydra13142/paint""image""image/color/palette""image/gif""math""os")var (pln *cube.Plainunx, uny cube.Vector)const (H = 18W = 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.Pointvar y [H + 1][W]geom.Pointdz := math.Pi / Hdxy := math.Pi * 4 / Wfor i := 0; i <= H; i++ {az := float64(i)*dz - math.Pi/2r := 300 * math.Cos(az)z := 100 * math.Sin(az)for j := 0; j < W; j++ {axy := float64(j) * dxyR := float64(j) * r / Wx[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 / Wdelay := 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].Yx[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),})}
package mainimport ("github.com/hydra13142/cube""github.com/hydra13142/geom""github.com/hydra13142/paint""image""image/color/palette""image/gif""math""os")var (pln *cube.Plainunx, uny cube.Vector)const (H = 9W = 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.Pointvar y [H*W + 1]geom.Pointdxy := (math.Pi * 2) / Wdz := math.Pi / Hfor i := 0; i <= H*W; i++ {az := float64(i)*dz/W - math.Pi/2r := 140 * math.Cos(az)z := 140 * math.Sin(az) axy := float64(i) * dxyx[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].Zx[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),})}

转载于:https://my.oschina.net/u/3626804/blog/1836979

你可能感兴趣的文章
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>
设计模式(十一):FACADE外观模式 -- 结构型模式
查看>>
iOS xcodebuile 自动编译打包ipa
查看>>
程序员眼中的 SQL Server-执行计划教会我如何创建索引?
查看>>
【BZOJ】1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
查看>>
cmake总结
查看>>