3

C++ GDI+ を使用して gif を開いています

しかし、フレーム間隔は本当に奇妙です。ウィンドウの pic Viewer で再生するのとは違います。

私が書いたコードは次のとおりです。

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 ヘッダーのフレーム期間フィールドの長さはわずか 2 バイトです (100 分の 1 秒として解釈され、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 に答える