2009-10-19 55 views
3

我使用C++ GDI +打开gifGDI + 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 这是什么意思?

并且我列出的代码是否适用于获取间隔?

非常感谢!

回答

2

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

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

+0

不幸的是,事实并非如此。至少不是在我的情况。 m_pTimeDelays->值处的缓冲区不是GIF标头。这是一个代表每个帧延迟的长值向量。首先是第一帧的延迟,第二帧是第二帧的延迟等等。 – EddieBytes 2012-05-11 13:44:00

1

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

  1. GetPropertyItemSize(PropertyTagFrameDelay)返回一个本地字节数组。将它转换为Int32数组而不是“长”数组会更安全。 “长”在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]); 

希望这有助于。