Анимация Gif

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 5 июл 2011.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    Если кому интересно в прикреплённом файле Анимация Gif.rar находятся исходники.
    Показ анимированных Gif файлов при помощи функций GDI+ с буферизацией данных и без.
    Нужно только в окно приложения перетащить мышкой Gif файл.
    С буферизацией это когда заточено для того чтобы не загружать лишний раз процессор
    (гонять по сто раз некоторые функции GDI+)
    а загрузить кадры Gif файла в память приложения и при анимации Гифа пользоватся данными оттуда.
    (хотя на современных быстрых компьютерах не исключено что это уже не актуально)
    Для кого это не важно и предназначен второй код без буферизации.
    В папке "IDA-Gif" лежит файл "IDA-Gif.asm" сделанный при помощи программы IDA.
    Предназначенный для тех кто просто захочет посмотреть как выглядят функции этого приложения
    на относительно чистом асемблере.
    Професионалов прошу сильно не пинать (если что то не так)
    Кто захочет оптимизировать код буду только рад.
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Очень неплохо. Хороший пример на GDI+, зачет
     
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    Спасибо
     
  4. Andrzej

    Andrzej New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2008
    Сообщения:
    11
    Время задержки фрейма на экране необходимо брать из метаданных GIF.
    ------------------
    В дополнение http://wasm.ru/forum/viewtopic.php?id=41678 и http://www.cyberforum.ru/assembler/thread327796.html цитата из спеки GIF89a:
     
  5. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    Andrzej
    Честно говоря не понял суть вашего замечания
    Время задержки фрейма у меня узнаётся при помощи тандема функций

    Код (Text):
    1. invoke GdipGetPropertyItemSize, hImag, 5100h, addr pFuncBsize
    2. invoke GdipGetPropertyItem, hImag, 5100h, pFuncBsize, addr pPropertyItem
    Они скорее всего и берут эти метаданные из Гифа
    Поясните конкретно ваше замечание
    Почему вас не устраивает именно эта реализация узнавания времени задержки фрейма?
    Ведь функция GdipGetPropertyItem с параметром 5100h - (PropertyTagFrameDelay)
    и заточена для этого.
     
  6. Andrzej

    Andrzej New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2008
    Сообщения:
    11
    Всё верно. Теперь йа увидел, что тандем функций выдает вектор для всех фреймов, а не значение для одного.
     
  7. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    Нашёл одну неприятную особенность у себя в коде.
    При тестировании я использовал 3 вроде бы обычных "Гифа" и сними всё было визуально хорошо.
    А потом наткнулся на один "Гиф" (смайлик) и увидел что при отрисовке следующего кадра предыдущий кадр остаётся виден.
    Потому что смайлики как правило имеют бесцветный фон и через эти бесцветные пиксилы к сожелению остаются видны
    предыдущие кадры. Я попробывал изменить алгоритм. Я и стирал предыдущий кадр перед отрисовкой следующего кадра,
    и прятал и делал не видимым, но нечего так и не добился ,потому что анимация шла с мерцанием. Так что в предыдущим коде
    мне так и не удалось исправить эту проблему. Буду рад если кто поможет или подскажет.
    Короче пришлось по шаманить. Я обратил внимание что у окна класса "Static" например с файлами формата "ico" таких проблем нет.
    Мне пришлось внести в код изменения точно подобрать слова не смогу но примерно это так (из "Гифа" идёт перегонка в "Иконку")
    Не исключено что это извращение, но проблема исчезла (контрол "Static" сам проделывал это чудо действие).
    Может я не правильно (и скорее всего это именно так) использовал "Static" в предыдущим коде но увы у меня не получается.
    Если кому надо или просто интересно прикрепляю второй код (там в папке для теста лежит смайлик "Smail.gif") Ради интереса прокрутите этот смайлик в предыдущим коде который находится постом выше и вы увидите разницу.
     
  8. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    203
    Исправил одну ошибочку в коде "Gif с буфером"
    Поэтому кто раньше скачивал файл "Анимация2 Gif.rar" желательно перекачать его
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    assch
    Спасибо!
    Было бы возможно тыцнул бы [+] к репутации )))