Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
1

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

29.06.2011, 19:18. Просмотров 1686. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2011, 19:18
Ответы с готовыми решениями:

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

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

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

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

5
2009 / 1281 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 00:07 2
Цитата Сообщение от 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  [ТС] 3
Честно говоря сам не пойму.
Все две функции срабатывают вроде бы без ошибок (на выходе в eax - 0 как и должно быть) но чувствую что то не то.
Я прикрепляю файл G.gif для примера.
Если посмотреть его в просмотрщике то видно что время последнего кадра больше чем у других.
Всего у этого гифа 27 кадров .

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

invoke GdipImageSelectActiveFrame, hImag, addr pGUID, 26

а потом 27

invoke GdipImageSelectActiveFrame, hImag, addr pGUID, 27

то значения в том и другом случае будут одинаковые а так быть не должно ведь время задержки
у них разное.
0
Миниатюры
Узнать время задержки в GIF  
2009 / 1281 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 15:41 4
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  [ТС] 5
Спасибо vital792
это те значения что и нужны
Попробую у себя

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

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

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

что означают?
0
2009 / 1281 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 16:08 6
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2011, 16:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.