[GDI +获取动画gif循环数总是比实际少1?

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

我正在使用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

毕竟,有两个问题:

  1. 循环计数得到的代码是否意味着实际播放时间减去1?
  2. gdi +区分实际循环计数1和2 gif的代码是什么?
visual-c++ gdi+ gif animated-gif
1个回答
0
投票

我使用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中可以看到,规则是:

  • “ NETSCAPE2.0”中的值0表示永远循环。
  • 缺少“ NETSCAPE2.0”块意味着0重复=循环一次。
  • “ NETSCAPE2.0”中的值1表示1次重复= 2个循环。
  • “ NETSCAPE2.0”中的值2表示2次重复= 3个循环。

我解决问题的方法是搜索NETSCAPE字节,如果存在,则仅使用GetPropertyItem值。

如果有帮助,我将在C#中涵盖这些场景的要点:

https://gist.github.com/NeilBostrom/8dde778f06e6f337ad73aea6e0152bbc

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