Home >Backend Development >Golang >Rendering .gif in Go

Rendering .gif in Go

PHPz
PHPzforward
2024-02-09 08:45:29932browse

在 Go 中渲染 .gif

In the Go language, rendering .gif files is a common task. The .gif file is a common dynamic picture format that can present dynamic effects by switching between consecutive image frames. In the Go language, we can use some libraries to process and render .gif files to achieve customized animation effects. This article will introduce how to render .gif files in Go language, and provide some sample code and techniques to help you better understand and apply this feature. Whether you are a beginner or an experienced developer, this article will provide you with helpful reference and guidance. Let's explore the secrets of rendering .gif files in Go language!

Question content

I'm trying to get the code sample to work. It comes from the "go programming language" (https://github.com/adonovan/gopl.io/blob/1ae3ec64947b7a5331b186f1b1138fc98c0f1c06/ch1/lissajous/main.go). When trying to view the animation, the gif is not rendered. gif rendering software error:

.gif Have the standards changed since 2016, or am I doing something wrong?

// 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
}

The build and run commands are:

go build .\main.go
.\main.exe > out.gif

Solution

Usebufio.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()

}

or

func main() {
    w := bufio.NewWriter(os.Stdout)
    lissajous(w)
    w.Flush()
    os.Stdout.Close()
}

The above is the detailed content of Rendering .gif in Go. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete