Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Как быстро создавать миниатюры изображений

Автор: BagmutA 20.4.2011, 11:20

Созаю миниатюры изображений:

QImage im;
    im.load(filename);
    im = im.scaled(icoWidth, icoHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);            
    im.save( filename_s, "JPG", 95);

Самый медленый этап: im.load(filename); -- занимает 80-90% процетов времени на создание миниатюр.
В общей сложности получается раза в 2-3 медленее чем это происходит в любом просмотрщике изображений(например Gwenview).
Подскажите, пожалуйста, как можно ускорить этот процесс, как создавать миниатюры не загружая полностью изображение.

Автор: wiz29 20.4.2011, 13:10

Цитата(BagmutA @ 20.4.2011, 12:20) *
Созаю миниатюры изображений:
QImage im;
    im.load(filename);
    im = im.scaled(icoWidth, icoHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);            
    im.save( filename_s, "JPG", 95);

Самый медленый этап: im.load(filename); -- занимает 80-90% процетов времени на создание миниатюр.
В общей сложности получается раза в 2-3 медленее чем это происходит в любом просмотрщике изображений(например Gwenview).
Подскажите, пожалуйста, как можно ускорить этот процесс, как создавать миниатюры не загружая полностью изображение.

Тебя смущает "подвисание" во время загрузки или что то еще?

Автор: BagmutA 20.4.2011, 13:38

Цитата(wiz29 @ 20.4.2011, 13:10) *
Цитата(BagmutA @ 20.4.2011, 12:20) *
Созаю миниатюры изображений:
QImage im;
    im.load(filename);
    im = im.scaled(icoWidth, icoHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);            
    im.save( filename_s, "JPG", 95);

Самый медленый этап: im.load(filename); -- занимает 80-90% процетов времени на создание миниатюр.
В общей сложности получается раза в 2-3 медленее чем это происходит в любом просмотрщике изображений(например Gwenview).
Подскажите, пожалуйста, как можно ускорить этот процесс, как создавать миниатюры не загружая полностью изображение.

Тебя смущает "подвисание" во время загрузки или что то еще?

Это все происходит в отдельном потоке.
Собственно интересует как можна быстро загрузит картинку или вообще как можна быстро создавать миниатюры изображений?

Автор: wiz29 20.4.2011, 13:54

Тогда нужно использовать конкретные библиотеки для чтения файлов графических форматов, например в JPEG могут хранится миниатюры, но не всегда они есть, поэтому придется загружать файл целиком (в случае когда нет миниатюры в файле). Это сэкономит время лишь в ряде случаев и не для всех типов форматов.

Если время создания миниатюр критично (например известно что они должны создаваться в основном для файлов фоток, в них как правило хранятся миниатюры) то используй libJPEG библиотеку для работы с jpeg'ом. в api libjpeg есть функции по загрузке миниатюр. Есть более общая либа, freeImage, она объединяет в себе несколько библиотек для чтения нескольких форматов файлов, на сколько универсально ее api не могу сказать, в моих проектах используются конкретные библиотеки для конкретных форматов.

Автор: RazrFalcon 20.4.2011, 15:16

Медленно - это сколько?
У меня на не новом ноуте, чтение изображение из тегов .flac и сжатие до 200pix, происходит практически мгновенно.

Можно покрутить сторонние библиотеки. Тот же openCV, imagemagic. Но у них тоже все упирается во время загрузки изображения. Это скорее от железа зависит.

Автор: BagmutA 20.4.2011, 15:23

Ну я же говорю, что в 2-3 раза медленне нежели в других просмотрщиках.

Есть идея использовать QIcon:

        QImage im;                    
    QIcon ico;
    QSize size(200, 200);
        ico.addFile(MainWindow::currentDir + MainWindow::listImage.at(i), size);
        im = ico.pixmap(size).toImage();
        im.save( MainWindow::currentDir + ".prev/" + MainWindow::listName.at(i), "JPG", 95);

Но проблема в том, что в QThread небезопасно использовать QPixmap, пишет:QPixmap: It is not safe to use pixmaps outside the GUI thread. И соответственно не сохраняется миниатюра.
Как можно преобразовать QIcon непосредственно в QImage или хотя бы без промежуточного использования QPixmap?

Автор: RazrFalcon 20.4.2011, 16:16

http://www.google.com.ua/search?aq=f&sourceid=chrome&client=ubuntu&channel=cs&ie=UTF-8&q=QIcon+to+QImage

Автор: BagmutA 20.4.2011, 16:43

Цитата(RazrFalcon @ 20.4.2011, 16:16) *
http://www.google.com.ua/search?aq=f&sourceid=chrome&client=ubuntu&channel=cs&ie=UTF-8&q=QIcon+to+QImage

Честно говоря я там ничего нужного не нашёл, если там и пытаются делать что-то похожее то посредством QPixmap.

Автор: wiz29 20.4.2011, 17:10

нельзя использовать QPixmap вне guithread , соответственно подходит только QImage.
в 2-3 раза медленнее с чем сравниваешь и на каких форматах изображения?

я писал нечто подобное, Image browser, он генерит представление thumbnail'ов работает не медленнее чем IrfanView. в Gui поток приходят миниатюры, дальше отправляются в QGraphicsView представление.

но там для чтения миниатюр из jpeg используется libJPEG. Поскольку они оч мало занимают, то загружаются практически мгновенно....

Автор: BagmutA 20.4.2011, 17:15

Цитата(wiz29 @ 20.4.2011, 17:10) *
в 2-3 раза медленнее с чем сравниваешь и на каких форматах изображения?

Брал папку с десятью 18-мегапиксельными изображениями и засекал время создания миниатюр в Gwenview и в моей программе.

Цитата(wiz29 @ 20.4.2011, 17:10) *
я писал нечто подобное, Image browser, он генерит представление thumbnail'ов работает не медленнее чем IrfanView. в Gui поток приходят миниатюры

А можно по подробней.

Автор: wiz29 20.4.2011, 17:28

к сожалению код показать не имею права, но подсказать кое что могу. 18 мпикс фотки формат jpeg? какие либы в составе Gwenview.

есть еще одна особенность открытия миниатюр например в стандартном виндовом браузере
Он тоже как бы мгновенно открывает миниатюры, но нужно не забывать что первый раз на создание кеша этих миниатюр у виндов тоже уходит заметное время.

Image browser, это компонент в разрабатываемой совтине, аналог Browse in bridge в Photoshop. но надо сказать там заметное время тратится на открытие больших картинок. Хотя они используют не Qt движок.

попробуй вырезать thumbnail из тестовых фоток и скормить Gwenview. Посмотри насколько быстро у них это получится для сравнения. QImage всегда зачитывают весь файл, вроде в мобильной версии Qt были какие то классы связанные с получением thumbnail'ов, но они не доступны для PC версии

Автор: BagmutA 23.4.2011, 11:13

Проблема решена.
Может кому то пригодится:

int icoWidth    = 200;
int icoHeight    = 200;
    QImageReader imageReader(MainWindow::currentDir + MainWindow::listImage.at(i));

    QSize size;
    int image_width;
    int image_height;

    if (imageReader.supportsOption(QImageIOHandler::Size))
    {
        size = imageReader.size();
        image_width = size.width();
        image_height = size.height();
    }

    double ratio = (double)image_width / (double)image_height;
    if (ratio >= 1)
    {
    image_width = icoWidth;
    image_height = image_width / ratio;
    }
    else
    {
        image_height = icoHeight;
        image_width = image_height * ratio;
    }

    imageReader.setScaledSize(QSize(image_width, image_height));
    QImage image = imageReader.read();

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)