2009-10-19 56 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]); 

希望這有助於。