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

Encoding 为什么GIF编码/解码块之间有这么多填充,encoding,hex,decode,gif,animated-gif,Encoding,Hex,Decode,Gif,Animated Gif,我一直在为一个项目开发一个自定义GIF解码器,这个项目需要尽可能少的GIF数据存储在RAM中(所以我可以根据需要逐字节从文件中提取所有内容) 我一直在学习以下教程: 在规范本身的帮助下: 我可以用我的解码器做非动画GIF和交通灯动画的例子。但是,当我尝试浏览从www.piskelapp.com导出的GIF(它使用GIF.js作为导出器)时,我会在不同的块之间得到很多填充,在某些情况下,填充不应该符合规范 例如,以下动画的开头如下所示: 47 49 46 38 39 61 20 00 20 0

我一直在为一个项目开发一个自定义GIF解码器,这个项目需要尽可能少的GIF数据存储在RAM中(所以我可以根据需要逐字节从文件中提取所有内容)

我一直在学习以下教程:

在规范本身的帮助下:

我可以用我的解码器做非动画GIF和交通灯动画的例子。但是,当我尝试浏览从www.piskelapp.com导出的GIF(它使用GIF.js作为导出器)时,我会在不同的块之间得到很多填充,在某些情况下,填充不应该符合规范

例如,以下动画的开头如下所示:

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”s、3“4E”s和2“FF”s,后跟一个持续760字节的00字符串。在760之后,我来到一个图形控件扩展(这是预期的,由0x21表示)。这发生在下面的许多块之间,除了我没有看到预期的任何类型的扩展代码,也没有在正确的位置看到图像描述符(应该以2C开头)


长短不一的是,我是不是在规范中遗漏了什么?这一切是什么,看起来像什么,填充物,我怎样才能避开它?我在其他使用其他编码器的GIF文件中看到过其他类型的填充,并且似乎没有一个一致的代码供我查找。该文件在Windows照片中工作,所以我肯定缺少一些东西

答案相当简单。Piskel使用的GIF导出器的实现很差

它在GIF89a规范中明确规定:

“应考虑此处指定的图形交换格式(sm) 完整;任何偏离均应视为无效,包括但不限于 仅限于在控件或数据中使用保留或未定义的字段 块,在块内或块之间包含无关数据,使用 格式中未明确列出的方法或算法等。”

我想指出的是“在块内或块之间包含无关数据”。在这种情况下,问题是块内的数据,出于某种原因,导出器Piskel使用的颜色表(全局和局部)始终为所有剩余空间填充黑色。在发现may解码实现错误后,我意识到了这一点,这导致了反复输入“黑色”(#000000)色码时出现问题

更多信息可在规范本身中找到,位于此处:


能否将目标GIF作为文件提供?我没有在Piskel注册,所以我能从中得到的只是一个
.Piskel
文件,它实际上是一个base64编码的PNG,附带一些元数据,但不是GIF。