go语言制作一个gif动态图_Golang

如题,关键不是图怎么样,而是说,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),
  })
}

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索gif
, go语言
动态图
go语言和golang、golang go语言、go语言为什么叫golang、golang gif、golang语言编程,以便于您获取更多的相关知识。

时间: 2024-09-13 15:55:56

go语言制作一个gif动态图_Golang的相关文章

go语言制作的zip压缩程序_Golang

可以压缩文件和目录. package main import ( "archive/zip" "bytes" "fmt" "io/ioutil" "os" "path/filepath" ) func main() { if err := compress(`gopkg`, `gopkg.zip`); err != nil { fmt.Println(err) } } // 参数frm可

动画不动-android-gif-drawable 加载太多的gif,有时gif动态图不动

问题描述 android-gif-drawable 加载太多的gif,有时gif动态图不动 我在项目里面加载使用android-gif-drawable,在一个listview里面,每个item都是一个gif动态图,比如动态表情,而且动态图重复率比较高,所以就做了**复用的机制**,但是发现加载太多,就会出现动态图不播放动画的情况,而且很频繁,求解? 解决方案 是不是内存耗用太多了,资源没有及时回收? 解决方案二: 建议用GifView加载gif

PS制作方脸猪GIF动态图

  PS制作方脸猪GIF动态图.这篇教程是向小编介绍用photoshop软件制作QQ表情动图之方脸猪wink方法,教程很不错,很值得大家学习,一起来看看吧. 方法/步骤 首先新建图层,画一个粉色的矩形,作为猪脸. 用钢笔画出耳朵,栅格化图层,填充为粉色,描边为黑色,复制耳朵图层,水平翻转,按住shift键移动到水平对面,并合并两个耳朵图层.裁剪图像,只剩矩形大小. 分类: PS入门教程

ps制作漂亮的流光字动态图

  ps制作漂亮的流光字动态图 1.打开ps,新建一个文档,数值如自己确定 2.点击"T"创建字幕,字幕属性,内容都由自己确定.打出字幕后,字幕移动到合适的位置 3.点右下角图层管理器中的创建新图层,创建一个新的图层1 4.单击工具栏中的渐变工具,双击渐变编辑器,出现渐 变编辑器窗口,选择七彩颜色.然后选择径向渐变 5.按住鼠标左键,向右拉,出现合适的颜色后,松开鼠标左键 6.点击工具栏的选择,将图层1往左拉至合适的位置 7.点击窗口,将动画命令打钩,出现如图所示的界面 8.在动画里复

photoshop制作劳动节快乐GIF动态图教程

给各位photoshop软件的使用者们来详细的解析分享一下制作劳动节快乐GIF动态图的教程. 教程分享: 新建一个图像.   点击窗口-时间轴,打开时间轴.   输入文字:劳动节快乐.   栅格化文字图层栅格化文字的作用是把文字图层变成普通图层.   新建3个图层.   给新建的几个图层填充上不同的颜色.   盖印图层把新建的几个图层分别与文字图层盖印图层,然后我们就得到四个新的盖印图层,把四张图片设置在时间轴上面   保存图片点击文件-储存为web所用格式,选择gif格式储存.然后把得到的动态

PS简单制作旋转起来的太极阴阳字GIF动态图效果教程

教程介绍用PS简单制作旋转起来的太极阴阳字GIF动态图效果,比较简单,喜欢的同学可以学习一下! 效果图: 添加一些元素后 1.打开素材,复制一层,在中间打上文字,将文字图层拉到两个太极图之间. 2.新建组,将三张图拖进组里,将最上方的太极图CTRL+T垂直翻转,在图层上点右键,创建剪贴蒙版. 3.做动画部份来了.复制组12份,到窗口-动画,打开动画面板,将第一帧里的组1的眼睛点掉,新建13帧空白帧. 从第二帧开始点开组1的眼睛,第三帧点开组1副本的眼睛,将组里的两个太极图分别旋转30度,第四帧点

Flash8制作一个动态交互的几何画板

动态|交互 在这个教程里我们将学习如何利用Flash制作一个交互的几何画板,在这个画板里可以改变线条粗细也可以改变颜色. 先看看效果吧!  点击这里下载源文件 制作步骤: 1.创建背景.新建立一个Flash文档,把第一个图层命名为interface bkg,我们在这个图层里绘制几何画板的背景.然后使用矩形工具在舞台上绘制一个宽100px的矩形,矩形的高不太重要,我们可以随时调整高度.调整的方法很多,这里我不详细讲解了. 2.创建选择线条粗细的按钮. 新建立一个图层改名为line thicknes

PhotoShop制作兔斯基表情GIF动态图效果教程

效果图: 1先建一个图层,不要太小就行,我选的是web透明,透明的原因是我好以后方便加一个背景什么的 2打开一个动态图,我选的是度娘表情兔斯基, 3用鼠标点兔斯基图层1按shift,再用鼠标点最上面的图层,这样就选择上全部图层,然后按ctrl+G形成一个组 分类: PS入门教程

美图秀秀制作一个靓丽水印教程分享

给各位美图秀秀软件的使用者们来详细的解析分享一下制作一个靓丽水印的教程. 教程分享:   运行美图秀秀;   选择"新建";   设置大小,背景一定要选择"透明"哦:   新建的背景OK了,然后选择"饰品";   选择"潮流涂鸦",可以自己选择哦;   然后选择"文字":   编辑文字;   保存自己的水印成果;   好了,以上的信息就是小编给各位美图秀秀的这一款软件的使用者们带来的详细的制作一个靓丽水印的