2009-10-19 5 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 имеет длину всего два байта (интерпретируется как 100ths секунды - допустимые значения от 0 до 32,768 секунд).

Возможно, вы интерпретируете его как long, который, вероятно, занимает 4 байта на вашей платформе, поэтому вы будете читать другое поле вместе с продолжительностью. Трудно сказать из кода, который вы предоставляете, но я думаю, что это проблема.

+0

К сожалению, это не тот случай. По крайней мере, не в моем случае. Буфер в значении m_pTimeDelays-> не является заголовком GIF. Это вектор длинных значений, представляющих задержки для каждого кадра. Первая длинная задержка для первого кадра, вторая длинная для второго кадра и т. Д. – EddieBytes

1

Задержки кадров не должны быть отрицательными. Я думаю, что ошибка возникает при преобразовании типа массива или «FrameNumber» выходит за пределы.

  1. GetPropertyItemSize (PropertyTagFrameDelay) возвращает собственный массив байтов. Будет безопаснее преобразовать его в массив Int32 вместо «длинного» массива. «long» всегда имеет длину 4 байта в 32-битных системах, но может быть 8 байтов в некоторых 64-битных системах.

  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]); 

Надеется, что это помогает.

Смежные вопросы