GDI+ gif 速度问题

3

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

但是我发现帧间隔时间非常奇怪,与Windows图片查看器播放的不同。

以下是我编写的代码:

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个回答

2
在gif头中,帧持续时间字段仅为两个字节长(被解释为100分之一秒 - 允许值从0到32.768秒)。
看起来您正在将其解释为“long”,在您的平台上可能是4个字节,因此您将读取另一个字段以及持续时间。从您提供的代码很难确定,但我认为这就是问题所在。

很遗憾,情况并非如此。至少在我的情况下是这样的。m_pTimeDelays->value 中的缓冲区不是 GIF 头。它是一个表示每帧延迟的长整数值向量。第一个长整数是第一帧的延迟,第二个长整数是第二帧的延迟,以此类推。 - EddieBytes

1

帧延迟不应该是负数。我认为错误出现在数组类型转换或“FrameNumber”越界时。

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

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接