我一直在为我正在处理的项目开发自定义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中使用,因此必须缺少一些内容。
答案 0 :(得分:1)
答案很简单。 Piskel使用的GIF导出程序的实施效果很差。
它在GIF89a规范中明确指出:
“应考虑此处指定的图形交换格式(sm) 完成;与之的任何偏差均应视为无效,包括但不包括 限于在控件或数据中使用保留或未定义的字段 块,在块内或块之间包含无关数据, 格式中未特别列出的方法或算法等。”
我要指出的是“在块内或块之间包含无关数据”。在这种情况下,问题在于块内的数据,出于某种原因,出口商Piskel总是使用黑色为所有剩余空间填充颜色表(全局和局部)。在发现可能的解码实现错误之后,我意识到了这一点,当按下重复的“黑色”(#000000)颜色代码时会引起问题。
更多信息可以在规范本身中找到,位于: