Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46

Узнать время задержки в GIF

29.06.2011, 19:18. Показов 2408. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одной статье GDI+: графика нового поколения нашёл пример как вывести анимированный Gif в окно приложения
Но там было сказано что в примере вывод анимации намеренно происходит с максимально возможной скоростью,
для наглядного показа производительности. В реальном же приложении потребуется получить
параметры задержки кадров из графического файла (вызвав функцию Image::GetPropertyItem с параметром
PropertyTagFrameDelay).

Сам алгоритм выглядит так:

Assembler
1
2
3
4
5
6
7
8
invoke MultiByteToWideChar,0,0,addr buffer,-1,addr Unicod,addr Char
invoke GdipLoadImageFromFile,addr Unicod, addr hImag
invoke GdipGetImageWidth, hImag, addr sWidth
invoke GdipGetImageHeight, hImag, addr sHeight
invoke GdipImageGetFrameDimensionsCount, hImag,addr sFdcount
invoke GdipImageGetFrameDimensionsList, hImag,addr pGUID,sFdcount
invoke GdipImageGetFrameCount, hImag,addr pGUID,addr sFrame
invoke GdipImageSelectActiveFrame, hImag,addr pGUID,pFrame
В последней функции GdipImageSelectActiveFrame находится

hImag - адрес где лежит кадр файла
pFrame - номер кадра

дальше нужно подключать функцию GdipGetPropertyItem (чтобы вытащить время задержки кадра)
Константа параметра PropertyTagFrameDelay - 5100h

Assembler
1
2
invoke GdipGetPropertyItemSize, hImag,5100h,addr pbyte
invoke GdipGetPropertyItem,hImag,5100h,pbyte,addr xxx
Пришлось подключить функцию GdipGetPropertyItemSize (как того требовало описание функции GdipGetPropertyItem)
Но нечего так и не добился (хотя не исключено что я всё сделал не правильно)

Кто нибудь в курсе этой темы?
Подскажите пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2011, 19:18
Ответы с готовыми решениями:

Время задержки delay
Доброго времени суток. столкнулся с AnyLogic University 6.9.0. задача: Есть 3 блока Sourсе. из них выходит по 1 заявке. при выходе каждой...

Разное время задержки
Здравствуйте. Такая проблема, есть функция, которая должна выполняться каждые N минут. Причем минуты могут быть разные. Например:...

Изменить в функции время задержки
Не получается изменить время задержки в функции void timer(int level), если в glutTimerFunc(level, timer, 0); подставить вместо level...

5
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 00:07
Цитата Сообщение от assch Посмотреть сообщение
Но нечего так и не добился (хотя не исключено что я всё сделал не правильно)
да вроде все правильно, а почему ты думаешь что ниче не добился? Я посмотрел для интереса в отладчике - поле xxx заполняется, вроде все честно. Хотя я сам не спец в gdiplus, так, встречался разок и конечно не на асме)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
.686
.model flat, stdcall
option casemap :none
 
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\gdiplus.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\gdiplus.lib
 
 
GdiplusStartupInput struct
GdiplusVersion      dd ?
DebugEventCallback  dd ?
SuppressBackgroundThread dd ?
SuppressExternalCodecs dd ?
GdiplusStartupInput ends
 
PropertyItem struct
_id  dd ?
_length dd ?
_type dd ?   ; dw ?
_value dd ?
PropertyItem ends
 
.data
gdiplusStartupInput GdiplusStartupInput <1, 0, 0, 0>
gdiplusToken dd ?
 
buffer  db "Golub.gif", 0
Unicod  dw 31 dup (0)
Char    dd ?
hImag   dd ?
sWidth  dd ?
sHeight dd ?
sFdcount dd ?
pGUID _GUID <?>
sFrame dd ?
pFrame dd ?
_size dd ?
xxx PropertyItem <?>
 
.code
start:
 
invoke GdiplusStartup, addr gdiplusToken, addr gdiplusStartupInput, 0
 
invoke MultiByteToWideChar, 0, 0, addr buffer, -1, addr Unicod, addr Char
invoke GdipLoadImageFromFile, addr Unicod, addr hImag
invoke GdipGetImageWidth, hImag, addr sWidth
invoke GdipGetImageHeight, hImag, addr sHeight
invoke GdipImageGetFrameDimensionsCount, hImag, addr sFdcount
invoke GdipImageGetFrameDimensionsList, hImag, addr pGUID, sFdcount
invoke GdipImageGetFrameCount, hImag, addr pGUID, addr sFrame
invoke GdipImageSelectActiveFrame, hImag, addr pGUID, pFrame
 
invoke GdipGetPropertyItemSize, hImag, 5100h, addr _size
invoke GdipGetPropertyItem, hImag, 5100h, _size, addr xxx
 
invoke ExitProcess,0
 
end start
1
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
30.06.2011, 13:36  [ТС]
Честно говоря сам не пойму.
Все две функции срабатывают вроде бы без ошибок (на выходе в eax - 0 как и должно быть) но чувствую что то не то.
Я прикрепляю файл G.gif для примера.
Если посмотреть его в просмотрщике то видно что время последнего кадра больше чем у других.
Всего у этого гифа 27 кадров .

И если в коде поставить 26

invoke GdipImageSelectActiveFrame, hImag, addr pGUID, 26

а потом 27

invoke GdipImageSelectActiveFrame, hImag, addr pGUID, 27

то значения в том и другом случае будут одинаковые а так быть не должно ведь время задержки
у них разное.
Миниатюры
Узнать время задержки в GIF  
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 15:41
Assembler
1
2
3
4
5
6
7
8
9
10
...
invoke GdipGetPropertyItemSize, hImag, 5100h, addr _size
; тут не помешало бы памяти выделить _size байт
invoke GdipGetPropertyItem, hImag, 5100h, _size, addr xxx
 
mov eax, [xxx._value]
mov eax, [eax + 4*26]     ; задержка для последнего кадра +0 для нулевого
invoke wsprintf, addr msg, addr fmt, eax
invoke MessageBox, 0, addr msg, addr msg, 0
...
для твоего gif'а у меня получилось 30 для первого кадра, 230 для последнего и 10 для остальных. Чтобы получить из них реальные задержки в мс я так понял нужно умножить эти значения на 10
1
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
30.06.2011, 16:00  [ТС]
Спасибо vital792
это те значения что и нужны
Попробую у себя

Добавлено через 13 минут
Ещё раз большое спасибо vital792
Честно говоря я бы не разобрался что в значении xxx._value
находятся параметры для каждого кадра

Ты не в курсе а другие параметры этой структуры

PropertyItem struct
_id dd ?
_length dd ?
_type dd ? ; dw ?
_value dd ?
PropertyItem ends

что означают?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 16:08
Цитата Сообщение от assch Посмотреть сообщение
параметры этой структуры
PropertyItem struct
_id dd ?
_length dd ?
_type dd ? ; dw ?
_value dd ?
PropertyItem ends
что означают?
это я тупо скопировал из с++ (из файла GdiPlusImaging.h). Там PropertyItem определен так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//---------------------------------------------------------------------------
// Property Item
//---------------------------------------------------------------------------
class PropertyItem
{
public:
    PROPID  id;                 // ID of this property
    ULONG   length;             // Length of the property value, in bytes
    WORD    type;               // Type of the value, as one of TAG_TYPE_XXX
                                // defined above
    VOID*   value;              // property value
};
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2011, 16:08
Помогаю со студенческими работами здесь

Время задержки между onclick и ondblclick
Ребят, подскажите пожалуйста, как прописать время задержки между onclick и ondblclick. Из памяти выпало...

QUdpSocket. Как сделать время задержки 0,5 мс
Здравствуйте уважаемые. Передаю пакеты - 1032 байта в одном. Передаю 65525 пакетов. Надо передать не более чем за 32,7 секунды. ...

Сигнал во время задержки для AVR
Добрый вечер! У меня такая проблема. В обработчике прерываний по переполнению таймера 0 происходит присвоение значения переменной...

Как поставить время задержки в анимации js
Я не разбираюсь в этом языке, но понимаю что нужно c.fl что то дописать что будет отвечать за задержку в анимации слайдера var...

Различное время задержки для разных заявок
Добрый день. У меня в задаче есть 2 типа агентов, нужно сделать чтобы время delay зависело от типа агента .


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru