【发布时间】:2017-05-26 16:17:02
【问题描述】:
我将从事一个与 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。
GIF: http://vader.joemonster.org/upload/rwu/1539970c1d48acceLw7m.gif
转到版本 1.7.4
【问题讨论】:
-
“损坏”是什么意思?你用的是什么版本的围棋?您能否提供一个不起作用的文件示例?
-
我已经编辑了问题
-
您确定这是您使用的准确代码和图像吗?您提供的图像是 9.2MB,而不是 3.4。这应该适用于 go1.7 和 go1.8。 (旁注,请务必检查错误之前推迟关闭,否则你会得到恐慌)
-
这个 gif 在技术上 开始损坏(LZW 字符串表溢出),这可能是导致问题的原因。大多数解码器会忽略这一点,但有些会出错。然而,让 Go 解码和编码 gif 似乎可以“解决”这个问题,所以我确定你看到了什么问题。至于尺寸差异,是不同的编码器,所以尺寸不保证完全一样。
-
好吧,我刚刚发现这里的问题是 Ubuntu 的默认图像查看器。 Chrome/Firefox 可以很好地处理这些 GIF。非常感谢您的宝贵时间。现在我需要阅读更多关于整个 GIF 编码的信息,因为我想知道是什么导致了图像查看器出现故障。是 Go 使用的编码吗?