Go Gif编码/解码

Go Gif编码/解码,go,gif,Go,Gif,我将致力于一个与GIF图像相关的项目,并尝试在Go中对其执行一些基本操作(例如检索帧或从一堆图像中创建GIF)。但现在让我们做一个简单的例子,我只是尝试解码一个GIF,然后再次编码。我试图使用“image/gif”软件包,但我无法让它实现我想要的功能。 代码如下: package main import ( "os" "image/gif" ) func main() { inputFile , err := os.Open("travolta.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的一种方式吗?我犯了什么错误

编辑: 所谓损坏,我的意思是,当我试图打开它时,会出现一个错误-screnshot here:

GIF:


Go version 1.7.4

问题在于,您正在将
文件*
传递给
DecodeAll
,而不是支持
io.Reader
接口的文件

我已经修改了您的代码,以便它从文件中创建一个
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
}

根据这个:os.Open返回和io.Reader。(否则它不会编译,我想?)此外,我将代码更改为您的版本,它仍然会生成损坏的gif。谢谢你的帮助!干杯你可能是对的。我确实试过在我的电脑上放一个gif,它确实读写了一个有效的gif。但我没有测试你的原始代码,这在事后看来是个错误。然而,这让我想知道,在你的代码之外是否有什么东西在起作用,比如一个损坏的原始Gif?我也想过,但我尝试了几个Gif,每个Gif都给出了一个损坏的结果。你说的“损坏”是什么意思?你使用的是什么版本的围棋?你能提供一个不起作用的文件样本吗?我已经编辑了这个问题,你确定这就是你正在使用的代码和图像吗?您提供的图像是9.2MB,而不是3.4。这在go1.7和go1.8中应该正常工作。(请注意,在推迟收盘前一定要检查错误,否则可能会出现恐慌)此gif在技术上已损坏,无法启动(LZW字符串表溢出),这可能是导致问题的原因。大多数解码器忽略了这一点,但有些会出错。然而,对gif进行解码和编码似乎“修复”了这个问题,所以我肯定你看到了什么问题。至于大小差异,它是一个不同的编码器,所以大小不能保证完全相同。好吧,我刚刚发现这里的问题是Ubuntu的默认图像查看器。Chrome/Firefox可以很好地处理这些GIF。非常感谢您抽出时间。现在我需要更多地了解整个GIF编码,因为我想知道是什么导致图像查看器出现故障。Go使用的是编码吗?