首頁 >後端開發 >Golang >控制台輸出串流和媒體檔案流之間的差異

控制台輸出串流和媒體檔案流之間的差異

WBOY
WBOY轉載
2024-02-08 23:15:09538瀏覽

控制台輸出串流和媒體檔案流之間的差異

php小編新一控制台輸出流和媒體檔案流之間的差異是程式開發中的一個重要概念。控制台輸出流主要用於將程式運行過程中的信息輸出到控制台,方便開發者進行偵錯和查看運行結果。而媒體檔案流則是用於讀取和寫入媒體文件,如音訊、視訊等。兩者在使用方式、資料處理和應用場景上存在一些差異,了解並掌握這些差異對於開發者來說是非常重要的。接下來我們將詳細探討這兩者之間的差異和使用技巧。

問題內容

我在嘗試在 Go 中渲染 GIF 時遇到問題。使用某種方法時,輸出的 GIF 檔案無法打開,但使用另一種方​​法則可以正常開啟。我在 Go 中找到了 Rendering .gif,但它沒有解決我的具體問題。

這是有問題的程式碼:

package main

import (
    "bufio"
    "fmt"
    "image"
    "image/color"
    "image/gif"
    "io"
    "math"
    "math/rand"
    "os"
    "time"
)

var palette = []color.Color{color.White, color.Black}

const (
    whiteIndex = 0
    blackIndex = 1
)

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

func lissajous(out io.Writer) {
    const (
        cycles  = 5
        res     = 0.001
        size    = 100
        nframes = 64
        delay   = 8
    )
    rand.Seed(time.Now().UTC().UnixNano())

    freq := rand.Float64() * 3.0
    anim := gif.GIF{LoopCount: nframes}
    phase := 0.0

    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)
    }
    err := gif.EncodeAll(out, &anim)
    if err != nil {
        return
    } else {
        fmt.Println(err)
    }
}

以下是指令:

go build main.go
main > out.gif

然後,out.gif 無法開啟。不過,這個方法效果很好:

func main() {
    fileName := "out.gif"
    f, err3 := os.Create(fileName)
    if err3 != nil {
        fmt.Println("create file fail")
    }
    w := bufio.NewWriter(f) 
    lissajous(w)
    w.Flush()
    f.Close()

}

我很困惑為什麼第一種方法無法建立功能性 GIF 文件,而第二種方法卻可以。這與 Go 處理檔案寫入或緩衝的方式有關嗎?

解決方法

根據@CeriseLimón 註解

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

解釋最後一個問題

#

以上是控制台輸出串流和媒體檔案流之間的差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除