go語(yǔ)言制作一個(gè)gif動(dòng)態(tài)圖
更新時(shí)間:2015年03月20日 15:10:24 投稿:hebedich
這篇文章主要介紹了go制作一個(gè)gif動(dòng)態(tài)圖的相關(guān)資料,需要的朋友可以參考下
如題,關(guān)鍵不是圖怎么樣,而是說,go可以拿來實(shí)現(xiàn)動(dòng)態(tài)圖驗(yàn)證碼,加上go支持cgi、fcgi,完全可以做個(gè)exe拿去增補(bǔ)現(xiàn)有的服務(wù)器么。
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),
})
}
以上就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本詳解
這篇文章主要給大家介紹了關(guān)于golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
深入探討Golang中如何進(jìn)行并發(fā)發(fā)送HTTP請(qǐng)求
在?Golang?領(lǐng)域,并發(fā)發(fā)送?HTTP?請(qǐng)求是優(yōu)化?Web?應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助2024-01-01
Golang實(shí)現(xiàn)支付寶沙箱支付的方法步驟
本文主要介紹了Golang實(shí)現(xiàn)支付寶沙箱支付的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
完美解決go Fscanf 在讀取文件時(shí)出現(xiàn)的問題
這篇文章主要介紹了完美解決go Fscanf 在讀取文件時(shí)出現(xiàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03

