Russian Qt Forum
Ноябрь 01, 2024, 11:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как быстро создавать миниатюры изображений  (Прочитано 7882 раз)
BagmutA
Гость
« : Апрель 20, 2011, 11:19 »

Созаю миниатюры изображений:
Код
C++ (Qt)
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).
Подскажите, пожалуйста, как можно ускорить этот процесс, как создавать миниатюры не загружая полностью изображение.
Записан
Fat-Zer
Гость
« Ответ #1 : Апрель 20, 2011, 11:29 »

а почему бы не посмотреть, как это сделано в gwenview?
Записан
meego_man
Гость
« Ответ #2 : Апрель 20, 2011, 11:39 »

Созаю миниатюры изображений:
Код
C++ (Qt)
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).
Подскажите, пожалуйста, как можно ускорить этот процесс, как создавать миниатюры не загружая полностью изображение.
у JPG есть вариант быстрой загрузки изображения. Правда Qt вроде как его не использует. Помню мне тоже требовалось быстро создавать миниатюры изображений, для этого я использовал FreeImage библиотеку. В ней есть вариант выбора скорость/качество.
Записан
Fat-Zer
Гость
« Ответ #3 : Апрель 20, 2011, 11:46 »

если кратко про gwenview, то они загружают изображения в отдельных потоках с помощью QtConcurrent
Записан
BagmutA
Гость
« Ответ #4 : Апрель 20, 2011, 12:19 »

если кратко про gwenview, то они загружают изображения в отдельных потоках с помощью QtConcurrent
Я собственно это делаю в QThread. А вот как быстро загружать изображение Непонимающий
Записан
BagmutA
Гость
« Ответ #5 : Апрель 20, 2011, 15:21 »

Есть идея использовать QIcon:
Код
C++ (Qt)
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?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 20, 2011, 15:27 »

Я собственно это делаю в QThread. А вот как быстро загружать изображение Непонимающий
кэшировать (по фолдеру)
Записан
BagmutA
Гость
« Ответ #7 : Апрель 20, 2011, 15:36 »

Я собственно это делаю в QThread. А вот как быстро загружать изображение Непонимающий
кэшировать (по фолдеру)
Кэширование будет полезно если я буду использовать одну и ту же картинку много раз, но я ее использую только раз.
Записан
Fat-Zer
Гость
« Ответ #8 : Апрель 20, 2011, 15:43 »

Я собственно это делаю в QThread. А вот как быстро загружать изображение Непонимающий
если это и так, то из вашего кода этого не видно...

ЗЫ: именно im.load() исполнять в отдельном потоке.
Записан
BagmutA
Гость
« Ответ #9 : Апрель 20, 2011, 15:52 »

Я собственно это делаю в QThread. А вот как быстро загружать изображение Непонимающий
если это и так, то из вашего кода этого не видно...

ЗЫ: именно im.load() исполнять в отдельном потоке.

Ну собственно мой класс унаследованій от QThread:
Код
C++ (Qt)
class MyThread : public QThread
{
public:
   MyThread()
   {
   }
 
   void run()
   {
    QDir curDir;
    curDir.setPath(MainWindow::currentDir);
    if ( !curDir.exists(".prev/") &&  MainWindow::listImage_Cout > 0 )
    {
    curDir.mkdir(".prev/");
    }
 
#ifdef WINDOWS
    QString path(MainWindow::currentDir + ".prev/");
    std::wstring wpath = path.toStdWString();
    const wchar_t * temp= wpath.c_str();
SetFileAttributes(temp,FILE_ATTRIBUTE_HIDDEN);
#endif
    for (int i=0; (i<MainWindow::listImage_Cout) && !MainWindow::stop_thread; ++i)
    {
    if (!QFile::exists( MainWindow::currentDir + ".prev/" + MainWindow::listName.at(i) ))
    {
    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);
 
    }
    }
   }
 
};
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Апрель 20, 2011, 16:00 »

Кэширование будет полезно если я буду использовать одну и ту же картинку много раз, но я ее использую только раз.
Зато используете много картинок которые (весьма вероятно) из одного фолдера. Ну и грузите их "пока трамваи ходют"
Записан
BagmutA
Гость
« Ответ #11 : Апрель 20, 2011, 16:22 »

Кэширование будет полезно если я буду использовать одну и ту же картинку много раз, но я ее использую только раз.
Зато используете много картинок которые (весьма вероятно) из одного фолдера. Ну и грузите их "пока трамваи ходют"
Будут непрерывно создаватся миниатюры одна за другой, а так как на открытие картинки(загрузки в кеш) уходит 80-90% времени, то пользы от кэша практически не будет
Записан
Fat-Zer
Гость
« Ответ #12 : Апрель 20, 2011, 16:38 »

Ну собственно мой класс унаследованій от QThread:
Код
C++ (Qt)
class MyThread : public QThread
{
public:
   MyThread()
   {
   }
 
   void run()
   {
    QDir curDir;
    curDir.setPath(MainWindow::currentDir);
    if ( !curDir.exists(".prev/") &&  MainWindow::listImage_Cout > 0 )
    {
    curDir.mkdir(".prev/");
    }
 
#ifdef WINDOWS
    QString path(MainWindow::currentDir + ".prev/");
    std::wstring wpath = path.toStdWString();
    const wchar_t * temp= wpath.c_str();
SetFileAttributes(temp,FILE_ATTRIBUTE_HIDDEN);
#endif
    for (int i=0; (i<MainWindow::listImage_Cout) && !MainWindow::stop_thread; ++i)
    {
    if (!QFile::exists( MainWindow::currentDir + ".prev/" + MainWindow::listName.at(i) ))
    {
    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);
 
    }
    }
   }
 
};
не то... я про первый способ. именно загружать изображение в отдельном потоке. а то и в нескольких.

QIcon загружает файл на im = ico.pixmap(size).toImage(); и тут мы никаких преимуществ не получаем.
Записан
BagmutA
Гость
« Ответ #13 : Апрель 20, 2011, 16:45 »

Ну собственно мой класс унаследованій от QThread:
Код
C++ (Qt)
class MyThread : public QThread
{
public:
   MyThread()
   {
   }
 
   void run()
   {
    QDir curDir;
    curDir.setPath(MainWindow::currentDir);
    if ( !curDir.exists(".prev/") &&  MainWindow::listImage_Cout > 0 )
    {
    curDir.mkdir(".prev/");
    }
 
#ifdef WINDOWS
    QString path(MainWindow::currentDir + ".prev/");
    std::wstring wpath = path.toStdWString();
    const wchar_t * temp= wpath.c_str();
SetFileAttributes(temp,FILE_ATTRIBUTE_HIDDEN);
#endif
    for (int i=0; (i<MainWindow::listImage_Cout) && !MainWindow::stop_thread; ++i)
    {
    if (!QFile::exists( MainWindow::currentDir + ".prev/" + MainWindow::listName.at(i) ))
    {
    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);
 
    }
    }
   }
 
};
не то... я про первый способ. именно загружать изображение в отдельном потоке. а то и в нескольких.

QIcon загружает файл на im = ico.pixmap(size).toImage(); и тут мы никаких преимуществ не получаем.

Так QIcon уже уменьшен до размера 200х200.
Записан
Fat-Zer
Гость
« Ответ #14 : Апрель 20, 2011, 16:49 »

Так QIcon уже уменьшен до размера 200х200.
так вы же сами сказали, что 80% времени тратится на загрузку файла. причём тут уменьшение?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.273 секунд. Запросов: 23.