在GO中将gif图像转换为base64

bvjveswy  于 2023-01-06  发布在  Go
关注(0)|答案(2)|浏览(247)

我尝试在Go语言中通过UDP发送一个gif文件,我认为最简单的方法是将gif图像转换为base64字符串并发送,但是当我将文件字节转换为base64时,它返回了一个空字符串,我尝试了模块“chilkat”的以下代码:

bd := chilkat.NewBinData()
success := bd.LoadFile(path.Join(folderPath, "final.gif"))
if success != true {
    panic("Fail!")
    bd.DisposeBinData()
    return
}
b64Data := *bd.GetEncoded("base64")

但是不行,如果有人能帮我

nue99wik

nue99wik1#

我建议使用标准库中的encoding/base64包。
您很可能希望将其转换或附加到[]byte切片中,该切片表示要发送的UDP数据包。
以下是将文件路径或io.Reader编码为[]byte的一些示例:

import (
    "bytes"
    "encoding/base64"
    "io"
    "os"
)

func EncodePath(path string) ([]byte, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, err
    }
    output := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
    base64.StdEncoding.Encode(output, data)
    return output, nil
}

func EncodeReader(rd io.Reader) ([]byte, error) {
    var b bytes.Buffer
    enc := base64.NewEncoder(base64.StdEncoding, &b)
    if _, err := io.Copy(enc, rd); err != nil {
        return nil, err
    }
    if err := enc.Close(); err != nil {
        return nil, err
    }
    return b.Bytes(), nil
}
ncgqoxb0

ncgqoxb02#

我的解决方案是:

var buff bytes.Buffer
gif.EncodeAll(&buff, &anim)
based := base64.StdEncoding.EncodeToString(buff.Bytes())

但是base64字符串显然太长,无法在UDP中发送,因此正确发送它的解决方案如下:

encoded := recordScreenToGIF(seconds) // Record X seconds of screen, & convert the result into a base64 GIF
splited := SplitSubN(encoded, 10000) // Split "encoded" each 10K characters
conn.Write([]byte(strconv.Itoa(len(splited))))
for _, elm := range splited {
    _, err = conn.Write([]byte(elm))
    if err != nil {
        panic(err)
    }
    time.Sleep(50 * time.Millisecond)
}
conn.Write([]byte("Done"))

相关问题