3

我正在使用 C++ GDI+ 打开一个 gif

但是我发现帧间隔真的很奇怪。它与窗口的图片查看器播放的不同。

我写的代码如下。

pMultiPageImg = new Bitmap(XXXXX);
int size = m_pMultiPageImg->GetPropertyItemSize(PropertyTagFrameDelay);
m_pTimeDelays = (PropertyItem*) malloc (size);
m_pMultiPageImg->GetPropertyItem(PropertyTagFrameDelay, size, m_pTimeDelays);
int frameSize =  m_pMultiPageImg->GetFrameDimensionsCount();();

// the interal of frame FrameNumber:
long lPause = ((long*)m_pTimeDelays->value)[FrameNumber] * 10;

但是我发现一些帧 lPause <= 0。这是什么意思?

我列出的代码是否适合获取间隔?

非常感谢!

4

2 回答 2

2

gif 标头中的帧持续时间字段只有两个字节长(解释为 100 分之一秒 - 允许值从 0 到 32.768 秒)。

您似乎将其解释为long,在您的平台上可能是 4 个字节,因此您将读取另一个字段以及持续时间。从您提供的代码中很难分辨,但我认为这就是问题所在。

于 2010-01-15T18:51:37.833 回答
1

帧延迟不应为负数。我认为错误是在数组类型转换期间出现的,或者“FrameNumber”超出范围。

  1. GetPropertyItemSize(PropertyTagFrameDelay) 返回本机字节数组。将其转换为 Int32 数组而不是“长”数组会更安全。“long”在 32 位系统下总是 4 个字节长,但在某些 64 位系统下可能是 8 个字节。

  2. m_pMultiPageImg->GetFrameDimensionsCount() 返回图像中的帧尺寸数,而不是帧数。通常使用第一帧(主图像)的尺寸来获得帧数。


在您的情况下,代码看起来像

int count = m_pMultiPageImg->GetFrameDimensionsCount();
GUID* dimensionIDs = new GUID[count];
m_pMultiPageImg->GetFrameDimensionsList(dimensionIDs, count);
int frameCount = m_pMultiPageImg->GetFrameCount(&m_pDimensionIDs[0]);

希望这可以帮助。

于 2012-05-17T20:26:49.477 回答