我正在使用gdi +来获取动画gif循环计数,当我用自己制作的gif测试代码时,我发现计数总是比IE11和Chrome浏览器中实际显示的少1,
除了我将循环计数设置为1,它将是1,对,
如果我将循环计数设置为2,3,依此类推,则代码将其获得为1,2,依此类推。
尽管循环计数为1和2的gif在IE11和Chrome中可以正确播放,代码获得与1相同的值。
我猜不到gif文件中是否有任何内容会重复出现。
[使用命令工具gifsicle列出gif信息后,我发现循环计数1和2 gif的区别,循环计数2 gif有一行
循环计数1
while循环计数1 gif还没有。
但是我不知道gdi +区分区别的代码是什么。
这是代码:
// new Bitmap
m_pBitmap = new Bitmap(szFilePath);
// get loop count
PropertyItem* pPropLoopCount;
UINT uSize = m_pBitmap->GetPropertyItemSize(PropertyTagLoopCount);
PropertyItem* pPropertyItem = (PropertyItem*)new char[uSize];
Status status = m_pBitmap->GetPropertyItem(PropertyTagLoopCount, uSize, pPropertyItem);
if (Status::Ok != status)
return false;
m_sLoopCount = *((SHORT*)pPropLoopCount->value);
document of MSDN刚刚说:
对于动画GIF图像,显示动画。值0指定动画应为无限显示。
关于PropertyTagLoopCount。
毕竟,有两个问题:
我使用GetPropertyItem在C#中遇到了相同的问题。我相信即使文件中缺少GetPropertyItem(20737)也会始终返回一个值。
这是实际字节数据的存储方式:
http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension
How to decode the application extension block of GIF?
从this comment中可以看到,规则是:
我解决问题的方法是搜索NETSCAPE字节,如果存在,则仅使用GetPropertyItem值。
如果有帮助,我将在C#中涵盖这些场景的要点:
https://gist.github.com/NeilBostrom/8dde778f06e6f337ad73aea6e0152bbc