在Go語言中,渲染.gif文件是一項常見任務。.gif文件是一種常見的動態圖片格式,通過在連續的圖像幀之間進行切換,可以呈現出動態效果。在Go語言中,我們可以使用一些庫來處理和渲染.gif文件,實現自定義的動畫效果。本文將介紹如何在Go語言中渲染.gif文件,并提供一些示例代碼和技巧,幫助您更好地理解和應用這一功能。無論您是初學者還是有一定經驗的開發者,本文都將為您提供有益的參考和指導。讓我們一起來探索在Go語言中渲染.gif文件的奧秘吧!
問題內容
我正在嘗試讓代碼示例正常工作。它來自“go 編程語言”(https://github.com/adonovan/gopl.io/blob/1ae3ec64947b7a5331b186f1b1138fc98c0f1c06/ch1/lissajous/main.go)。嘗試查看動畫時,未渲染 gif。 gif渲染軟件報錯:
.gif 標準自 2016 年以來是否發生了變化,還是我做錯了什么?
// copyright ? 2016 alan a. a. donovan & brian w. kernighan.
// license: https://creativecommons.org/licenses/by-nc-sa/4.0/
// lissajous generates gif animations of random lissajous figures.
package main
import (
"image"
"image/color"
"image/gif"
"io"
"math"
"math/rand"
"os"
)
var palette = []color.color{color.white, color.black}
const (
whiteindex = 0 // first color in palette
blackindex = 1 // next color in palette
)
func main() {
lissajous(os.stdout)
}
func lissajous(out io.writer) {
const (
cycles = 5 // number of complete x oscillator revolutions
res = 0.001 // angular resolution
size = 100 // image canvas covers [-size..+size]
nframes = 64 // number of animation frames
delay = 8 // delay between frames in 10ms units
)
freq := rand.float64() * 3.0 // relative frequency of y oscillator
anim := gif.gif{loopcount: nframes}
phase := 0.0 // phase difference
for i := 0; i < nframes; i++ {
rect := image.rect(0, 0, 2*size+1, 2*size+1)
img := image.newpaletted(rect, palette)
for t := 0.0; t < cycles*2*math.pi; t += res {
x := math.sin(t)
y := math.sin(t*freq + phase)
img.setcolorindex(size+int(x*size+0.5), size+int(y*size+0.5),
blackindex)
}
phase += 0.1
anim.delay = append(anim.delay, delay)
anim.image = append(anim.image, img)
}
gif.encodeall(out, &anim) // note: ignoring encoding errors
}
登錄后復制
構建和運行命令是:
go build .\main.go .\main.exe > out.gif
登錄后復制
解決方法
使用bufio.newwriter
func main() {
filename := "1.gif"
f, err3 := os.create(filename)
if err3 != nil {
fmt.println("create file fail")
}
w := bufio.newwriter(f)
lissajous(w)
w.flush()
f.close()
}
登錄后復制
或
func main() {
w := bufio.NewWriter(os.Stdout)
lissajous(w)
w.Flush()
os.Stdout.Close()
}
登錄后復制






