crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Работа с гиф анимацией, И только кошка гуляет сама по себе... ))))
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 )
bool QImageReader::jumpToNextImage ()
всегда возвращают false, и мы не знаем, можем ли мы считывать следующий кадр или нет. Усложняемся все тем, что если мы производим лишнюю операцию чтения, возникает непонятная для меня ошибка, и даже если мы снова сделаем setFileName, считать мы больше ничего не сможем. Т.е. новый цикл анимации не начнем.

Собственно говоря, у меня вопрос к сообществу. Что это бага, или я не разобрался в вопросе?


------------------------------------------------------------------------------------------------------------

Тем не менее, если вручную контролировать количество кадров (можно узнать любым графическим редактором), работа с гиф анимацией становится простой и удобной. Предлагаю, на мой взгляд, очень интересную демку. Надеюсь Вам понравится :).
Компилируем, смотрим, отписываемся о результатах.
Прикрепленные файлы
Прикрепленный файл  gifWidget.zip ( 11.35 килобайт ) Кол-во скачиваний: 148
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 29.5.2009, 14:07
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(igor_bogomolov @ 29.5.2009, 14:32) *
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  


Цитата(kwisp @ 29.5.2009, 15:07) *
вернуло 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
int QImageIOHandler::imageCount() const
{
    return canRead() ? 1 : 0;
}
int QImageReader::imageCount() const
{
    if (!d->initHandler())
        return -1;
    return d->handler->imageCount();
}

собственно всё.
она кроме 0 и 1 ничего не вернет
:)

Цитата(kwisp @ 29.5.2009, 15:07) *
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.

я это ктому что после рида то проверка нужна :) у тебя нет

Цитата(igor_bogomolov @ 29.5.2009, 15:44) *
А как новый цикл начать без использования setFileName?

походу только так
bool QImageReader::jumpToImage ( int imageNumber )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 29.5.2009, 14:55
Сообщение #5


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(kwisp @ 29.5.2009, 15:49) *
я это ктому что после рида то проверка нужна у тебя нет
Переделат так. Все работает. За количеством кадров следить не надо.

Раскрывающийся текст
    if(imageR.canRead()) {
        image = imageR.read();
        if(mirror) image = image.mirrored(true,false);
        pix = QPixmap::fromImage(image);
        setPixmap(pix);
        setMask(pix.mask());
    } else {
        //imageR.jumpToImage(1);
        imageR.setFileName("../persian.gif");
    }


Цитата(kwisp @ 29.5.2009, 15:49) *
походу только так
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
Раскрывающийся текст

int QImageIOHandler::imageCount() const
{
    return canRead() ? 1 : 0;
}

/*!
   For image formats that support animation, this function jumps to the
   next image.

   The default implementation does nothing, and returns false.
*/
bool QImageIOHandler::jumpToNextImage()
{
    return false;
}

/*!
   For image formats that support animation, this function jumps to the image
   whose sequence number is \a imageNumber. The next call to read() will
   attempt to read this image.

   The default implementation does nothing, and returns false.
*/
bool QImageIOHandler::jumpToImage(int imageNumber)
{
    Q_UNUSED(imageNumber);
    return false;
}

/*!
    For image formats that support animation, this function returns
    the number of times the animation should loop. If the image format
    does not support animation, 0 is returned.
*/
int QImageIOHandler::loopCount() const
{
    return 0;
}

/*!
    For image formats that support animation, this function returns
    the number of milliseconds to wait until reading the next
    image. If the image format does not support animation, 0 is
    returned.
*/
int QImageIOHandler::nextImageDelay() const
{
    return 0;
}


не могу найти в исходниках где
переопределяется переопределяются данные виртуальные функции :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 29.5.2009, 15:06
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy @ 29.5.2009, 15:58) *
Я для проигрования gif'ки использовал QMovie + QLable.
Это понятно. Все так используют. А если нужен overpainting? ;)
QLabel тут не подойтет. QMovie конечно можно использовать вместо QImageReader. Наверное так и надо сделать.

Собери примет из первого сообщения. Помоему прикольно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.5.2009, 15:38
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 29.5.2009, 19:06) *
Собери примет из первого сообщения.
Эх последнее время у меня ни на что времени не хватает :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 29.5.2009, 15:41
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


нашел где переопределяют imageCount
похоже либо бага либо недоделка либо я накосячил.

int QGifHandler::imageCount() const
{
    return 0; // Don't know
}

таж фигня вид сбоку и функция не виртуальная.

мда.... сразу мона было позырить
сюда

там вообще не только одна функция непереопределена штук 5 недоделаны.

Сообщение отредактировал kwisp - 29.5.2009, 15:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 16:32