2009-10-19 16 views
3

J'utilise C++ GDI + pour ouvrir un mais je trouve gifGDI + problème vitesse gif

l'intervalle de trame est vraiment étrange. Il est différent de le lire par le visionneur de photos de la fenêtre.

Le code que j'ai écrit est le suivant.

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; 

mais je trouve un certain cadre du lPause < = 0. Qu'est-ce que cela signifie?

Et le code I est-il indiqué pour obtenir l'intervalle?

Merci beaucoup!

Répondre

2

Le champ de durée de trame dans l'en-tête gif est long seulement de deux octets (interprété en tant que centièmes de seconde - permettant des valeurs comprises entre 0 et 32,768 secondes).

Vous semblez l'interpréter comme long, qui est probablement 4 octets sur votre plate-forme, donc vous lirez un autre champ avec la durée. Il est difficile de dire à partir du code que vous fournissez, mais je pense que c'est le problème.

+0

Malheureusement, ce n'est pas le cas. Au moins pas dans mon cas. Le tampon à m_pTimeDelays-> value n'est pas un en-tête GIF. C'est un vecteur de longues valeurs représentant les retards pour chaque trame. Le premier est le délai pour la première image, le second pour la deuxième image, etc. – EddieBytes

1

Les retards de trame ne doivent pas être des nombres négatifs. Je pense que l'erreur survient lors de la conversion du type de tableau ou "FrameNumber" sort des limites.

  1. GetPropertyItemSize (PropertyTagFrameDelay) renvoie un tableau d'octets natif. Il sera plus sûr de le convertir en un tableau Int32 au lieu d'un tableau "long". "long" est toujours long de 4 octets sous les systèmes 32 bits, mais peut être de 8 octets sous certains systèmes 64 bits.

  2. m_pMultiPageImg-> GetFrameDimensionsCount() renvoie le nombre de dimensions d'image dans l'image, et non le nombre d'images. La dimension de la première image (image maître) est généralement utilisée pour obtenir le nombre d'images.


Dans votre cas, le code ressemble

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

Hope this helps.