[FMX] FMX.Graphics.Android 中对 GIF 判断的问题的修正

关于这个 Bug 的详情,大家可以参考:https://quality.embarcadero.com/browse/RSP-12424

Berlin 中的 FMX.Graphics.Android 实现的原始代码如下:

存在的问题:

  • 第一个判定不完善,流的大小大于 GIF 头部大小并不代表内容从当前位置读取剩余的内容长度大于3,所以这块应该改成
  • 另一个问题是一个低级的问题,Char 类型在 Android 上对应的是 WideChar,也就是说是 2 个字节,然后它没有初始化,直接读取。由于 Value 的值为随机值,所以,有可能两个字节的内容不为空,结果就造成添加时出现问题,造成正确的GIF文件格式无法读取。实际上只需要 Value 初始为 0 就可以了。
  • 吐个槽:这么简单判定为啥要用 TStringBuilder?这让我想起一个笑话,说是为了让用户掏钱,故意在程序中加入 Sleep 来减慢程序的速度,这样以后借口优化就可以让用户掏更多的钱了。再怎么说,TStringBuilder也是一个对象,而且牵涉到内存的额外分配释放,纯属脱裤子放屁,多此一举。

好吧,再补充一点吧:GIF 实际上有两种头,一种头是 GIF89a,另外一种是 GIF87a,无论那种,头部实际上是6个字节,而不是 3 个,如果象上面只判断 GIF ,显然有失严谨。

给一个参考的修正代码:

这里故意填充了ID到8位,以便直接将 GIF 头当成64位整数来比较,提高效率。

分享到:

1 条评论

沙发空缺中,还不快抢~