Работа с гиф анимацией, И только кошка гуляет сама по себе... )))) |
Здравствуйте, гость ( Вход | Регистрация )
Работа с гиф анимацией, И только кошка гуляет сама по себе... )))) |
igor_bogomolov |
29.5.2009, 13:32
Сообщение
#1
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Привет всем.
Недавно задался вопросом, как можно средствами Qt вытащить кадр из gif. Оказалось, что для этого существует класс QImageReader. Для работы с графическими файлами поддерживающих анимацию, есть методы, которые позволяют нам узнать, сколько кадров содержит файл, период обновления кадров, возможно ли перейти на кадр с определенным номером, и т.д. Но, при работе с этими методами возникли некоторые "трудности". методы Цитата int QImageReader::loopCount () const всегда возвращают ноль, т.е. мы не можем узнать, сколько реально кадров содержит файл.int QImageReader::imageCount () const Цитата bool QImageReader::jumpToImage ( int imageNumber ) всегда возвращают false, и мы не знаем, можем ли мы считывать следующий кадр или нет. Усложняемся все тем, что если мы производим лишнюю операцию чтения, возникает непонятная для меня ошибка, и даже если мы снова сделаем setFileName, считать мы больше ничего не сможем. Т.е. новый цикл анимации не начнем.bool QImageReader::jumpToNextImage () Собственно говоря, у меня вопрос к сообществу. Что это бага, или я не разобрался в вопросе? ------------------------------------------------------------------------------------------------------------ Тем не менее, если вручную контролировать количество кадров (можно узнать любым графическим редактором), работа с гиф анимацией становится простой и удобной. Предлагаю, на мой взгляд, очень интересную демку. Надеюсь Вам понравится . Компилируем, смотрим, отписываемся о результатах.
Прикрепленные файлы
|
|
|
kwisp |
29.5.2009, 14:07
Сообщение
#2
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
int QImageReader::loopCount () const вернуло 999 для кота(кошки). Цитата canRead() is a lightweight function that only does a quick test to see if the image data is valid. read() may still return false after canRead() returns true, if the image data is corrupt.
Сообщение отредактировал kwisp - 29.5.2009, 14:18 |
|
|
igor_bogomolov |
29.5.2009, 14:44
Сообщение
#3
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
вернуло 999 для кота(кошки). А реально там 11 кодров. nextImageDelay и loopCount возвращают чуш. Надо попробовать заменить QImageReader на QMovie. Он такой же набор методов предоставляет. kwisp, спасибо разобрался. Счетчик действительно лишний. А как новый цикл начать без использования setFileName? |
|
|
kwisp |
29.5.2009, 14:49
Сообщение
#4
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
igor_bogomolov,
лажа какая то в исходниках добрался до виртуальной функции класса QImageIOHandler::imageCount() int
собственно всё. она кроме 0 и 1 ничего не вернет canRead() is a lightweight function that only does a quick test to see if the image data is valid. read() may still return false after canRead() returns true, if the image data is corrupt. я это ктому что после рида то проверка нужна у тебя нет А как новый цикл начать без использования setFileName? походу только так bool QImageReader::jumpToImage ( int imageNumber ) |
|
|
igor_bogomolov |
29.5.2009, 14:55
Сообщение
#5
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
я это ктому что после рида то проверка нужна у тебя нет Переделат так. Все работает. За количеством кадров следить не надо. Раскрывающийся текст
походу только так Не получается этим методом (((
bool QImageReader::jumpToImage ( int imageNumber ) Сообщение отредактировал igor_bogomolov - 29.5.2009, 14:57 |
|
|
Litkevich Yuriy |
29.5.2009, 14:58
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Я для проигрования gif'ки использовал QMovie + QLable.
|
|
|
kwisp |
29.5.2009, 15:01
Сообщение
#7
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
igor_bogomolov,
загляни в исходники. очень удивишься. класс QImageIOHandler содержит виртуальные функции и предназначен походу для наследования и переопределения их. из файла qimgeiohandler.cpp Раскрывающийся текст
не могу найти в исходниках где переопределяется переопределяются данные виртуальные функции |
|
|
igor_bogomolov |
29.5.2009, 15:06
Сообщение
#8
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Я для проигрования gif'ки использовал QMovie + QLable. Это понятно. Все так используют. А если нужен overpainting? QLabel тут не подойтет. QMovie конечно можно использовать вместо QImageReader. Наверное так и надо сделать. Собери примет из первого сообщения. Помоему прикольно. |
|
|
Litkevich Yuriy |
29.5.2009, 15:38
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
kwisp |
29.5.2009, 15:41
Сообщение
#10
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
нашел где переопределяют imageCount
похоже либо бага либо недоделка либо я накосячил.
таж фигня вид сбоку и функция не виртуальная. мда.... сразу мона было позырить сюда там вообще не только одна функция непереопределена штук 5 недоделаны. Сообщение отредактировал kwisp - 29.5.2009, 15:53 |
|
|
Текстовая версия | Сейчас: 3.12.2024, 7:39 |