Maison >développement back-end >Golang >Rendu .gif dans Go

Rendu .gif dans Go

PHPz
PHPzavant
2024-02-09 08:45:29926parcourir

在 Go 中渲染 .gif

En langage Go, le rendu des fichiers .gif est une tâche courante. Le fichier .gif est un format d'image dynamique courant qui peut présenter des effets dynamiques en basculant entre des images d'image consécutives. Dans le langage Go, nous pouvons utiliser certaines bibliothèques pour traiter et restituer des fichiers .gif afin d'obtenir des effets d'animation personnalisés. Cet article explique comment restituer les fichiers .gif en langage Go et fournit des exemples de code et des techniques pour vous aider à mieux comprendre et appliquer cette fonctionnalité. Que vous soyez un développeur débutant ou expérimenté, cet article vous fournira des références et des conseils utiles. Explorons les secrets du rendu des fichiers .gif en langage Go !

Contenu de la question

J'essaie de faire fonctionner l'exemple de code. Il vient du "langage de programmation go" (https://github.com/adonovan/gopl.io/blob/1ae3ec64947b7a5331b186f1b1138fc98c0f1c06/ch1/lissajous/main.go). Lorsque vous essayez de visualiser l'animation, le gif n'est pas rendu. Erreur du logiciel de rendu GIF :

.gif Les normes ont-elles changé depuis 2016 ou est-ce que je fais quelque chose de mal ?

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

Les commandes de construction et d'exécution sont :

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

Solution

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

}

ou

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer