【问题标题】:Encoding/Decoding a Gif编码/解码 Gif
【发布时间】: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 使用的编码吗?

标签: go gif


【解决方案1】:

问题是您将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
}

【讨论】:

  • 据此:stackoverflow.com/questions/25677235/…os.Open 返回和 io.Reader。 (否则我认为它不会编译?)此外,我将代码更改为您的版本,它仍然会产生损坏的 gif。不过感谢您的帮助!
  • 干杯。你可能是对的。我确实尝试过使用我电脑上的 gif,它确实读取并写回了一个有效的 gif。但是我没有测试您的原始代码,这是事后看来的错误。但是 - 这让我想知道您的代码之外是否有什么东西在起作用,比如损坏的原始 Gif?
  • 我也想过,但我尝试了几个 GIF,每个都给出了损坏的结果。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2023-03-03
  • 2011-04-21
  • 2012-11-11
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多