我将从事与 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/