go - 编码/解码 Gif

标签 go gif

我将从事与 GIF 图像相关的项目,并尝试在 Go 中对它们执行一些基本操作(例如检索帧或从一堆图像创建 GIF)。但现在让我们做一个简单的例子,我只是想解码 GIF,然后再次编码。我尝试使用 "image/gif" 包,但我无法让它执行我想要的操作。
这是代码:

package main

import (
    "os"
    "image/gif"
)


func main() {
    inputFile , err := os.Open("travolta.gif")
    defer inputFile.Close()
    if err != nil {
        panic(err)
    }

    g, err := gif.DecodeAll(inputFile)
    if err != nil {
        panic(err)
    }

    outputFile, err := os.OpenFile("travolta2.gif", os.O_WRONLY|os.O_CREATE, 0777)
    defer outputFile.Close()
    if err != nil {
        panic(err)
    }

    err = gif.EncodeAll(outputFile, g)
    if err != nil {
        panic(err)
    }
} 

当我运行代码时,它不会崩溃,并且确实创建了另一个 gif。不幸的是它已损坏。此外,gif 的大小从 3.4MB 变为 4.4MB。这不是一种保存/阅读 gif 的方法吗?我犯了什么错误?

编辑: 我所说的损坏是指当我尝试打开它时发生错误 - 此处截图:http://www.filedropper.com/obrazekpociety .

动图: http://vader.joemonster.org/upload/rwu/1539970c1d48acceLw7m.gif

Go 版本 1.7.4

最佳答案

问题是您将 File* 传递给 DecodeAll 而不是支持 io.Reader 接口(interface)的东西。

我已经调整了您的代码,以便它从文件中创建一个 bufio.Reader,然后将其交给 DecodeAll,如下所示:

import (
    "bufio"
    "os"
    "image/gif"
)
func main() {
    inputFile , err := os.Open("travolta.gif")
    defer inputFile.Close()
    if err != nil {
        panic(err)
    }

    r := bufio.NewReader(inputFile)

    g, err := gif.DecodeAll(r)
    if err != nil {
        panic(err)
    }

    // ... remaining code
}

关于go - 编码/解码 Gif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41598238/

相关文章:

css - 如何像 Droplr 一样使用 CSS/jQuery 淡入/淡出多个文本?

html - 如何为网页背景显示 gif 全屏?

macos - 如何将屏幕录制成 gif 格式?

ios - iPhone应用程序映射当前用户位置GIF

go - 在 Golang 的同一台服务器上调用已注册的 RPC 方法

go - 自动创建结构实例

pointers - 如何以并行方式传递指针的引用?

javascript - 如何压缩一系列PNG以供加载?

go - 如何将结构转换为具有较少字段的不同结构

go - runtime._ExternalCode Cpu 使用率过高,高达 80%