GDI + gif速度问题

时间:2009-10-19 07:38:37

标签: c++ gdi+ frame gif intervals

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

然而,我发现帧间隔真的很奇怪。 它与窗口的pic查看器不同。

我写的代码如下。

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的帧。 这是什么意思?

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

非常感谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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


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

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

    希望这有帮助。