为什么在块之间的GIF编码/解码中有这么多填充

问题描述 投票:1回答:1

我一直在为我正在研究的项目开发一个自定义GIF解码器,它需要尽可能少的GIF数据存储在RAM中(所以我有效地将所有内容从文件中拉出来,字节按字节)。

我一直在使用以下教程:

http://matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp

在规范本身的帮助下:

https://www.w3.org/Graphics/GIF/spec-gif89a.txt

我可以使用我的解码器同时完成非动画GIF和交通信号灯动画示例。但是当我尝试通过从www.piskelapp.com(使用gif.js作为其导出器)导出的GIF时,我在不同的块之间得到了很多填充,填充在某些情况下应该不会根据规格。

例如,以下动画https://www.piskelapp.com/p/agxzfnBpc2tlbC1hcHByEwsSBlBpc2tlbBiAgICA_eOjCgw/edit的开头如下所示:

47 49 46 38 39 61 20 00 20 00 F7 00 00 00 00 00 4E 4E 4E FF FF 00 00 00 00 00

前6个字节应该是标题(ASCII中的GIF89a),接下来的7个应该是逻辑屏幕描述符(LSD)。根据这里的信息,应该紧接着的是一系列与LSD中的颜色数匹配的颜色数据。但事实并非如此,它只是3“00”,3“4E”和2“FF”,后跟一串00s,持续760个字节。在那之后760,我来到一个图形控制扩展(预期,并用0x21表示)。这发生在以下许多块之间,除了我没有看到任何类型的扩展代码,我也没有看到正确位置的图像描述符(应该从2C开始)。

它的长短是,我错过了规范中的一些东西吗?这是什么,看起来像什么,填充,我怎么能绕过它?我已经在使用其他编码器的其他GIF文件中看到了其他类型的填充,并且似乎没有一致的代码供我查找。该文件适用于Windows Photos,因此必须有一些我不知道的东西。

encoding hex decode gif animated-gif
1个回答
1
投票

答案非常简单。 Piskel使用的GIF导出器实现起来很差。

它在GIF89a规范中明确指出:

“此处指定的图形交换格式(sm)应视为完整;任何与它的偏差都应视为无效,包括但不限于在控制或数据块中使用保留或未定义的字段,在其中包含无关数据或者在块之间,使用未特别列为格式的一部分的方法或算法等。“

我要指出的是“在块内或块之间包含无关数据”。在这种情况下,问题是块内的数据,由于某种原因,Piskel使用的导出器总是用所有剩余空间的黑色填充颜色表(全局和本地)。在发现可能解码实现错误之后我意识到这一点,这在敲击重复的“黑色”(#000000)颜色代码时引起了问题。

更多信息可以在规范中找到,位于:

https://www.w3.org/Graphics/GIF/spec-gif89a.txt

© www.soinside.com 2019 - 2024. All rights reserved.