编码/解码Gif

时间:2017-01-11 18:34:49

标签: 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的方法吗?我犯了什么错误?

修改 损坏我的意思是当我试图打开它时发生错误 - screnshot here:http://www.filedropper.com/obrazekpociety

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

转到版本1.7.4

1 个答案:

答案 0 :(得分:0)

问题是您将File*传递给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
}