Использование библиотеки CImg с Qt для более быстрого изменения размера изображения. Стоит копать?

Мой проект заключается в пакетном изменении размера большого количества (30000) небольших изображений в формате jpeg (400 * 300) до 15 различных размеров назначения (которые меньше исходного).

Сначала я создал многопоточный инструмент командной строки на основе CImg и libjpg для пакетной обработки изображений. И работает как шарм на моем блокноте Ubuntu с 4 * 2 ядрами (20 минут).

Теперь клиенту нужен графический интерфейс для инструмента с индикаторами выполнения, расчетным временем, предварительным просмотром и т. д.! И хочу, чтобы он работал и в Windows. Он хочет что-то вроде менеджера изображений.

Я начал портировать чистую командную строку C++ на Qt и его класс QImage (QtConcurrent::run для многопоточности), и вот проблема: На той же машине он работает в 3 раза медленнее на Windows 7 x64 (около 50 минут)!

Итак, как использовать Qt для чтения изображений и CImg для изменения их размера? И будет ли он работать быстрее?


person Yassine Zaroui    schedule 12.07.2011    source источник
comment
Вы делаете текстуру видео с мип-маппингом? :)   -  person vines    schedule 12.07.2011
comment
Нет, у моего клиента много сайтов для продвижения своей продукции, и на каждом сайте свои размеры изображений.   -  person Yassine Zaroui    schedule 12.07.2011
comment
Ты только что меня подстрелил... х_х   -  person vines    schedule 12.07.2011


Ответы (2)


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

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

person Fabio Fracassi    schedule 12.07.2011
comment
Во-первых, как вы сказали, это небольшой проект, и я не хочу управлять двумя разными независимыми проектами (API и GUI)! Во-вторых, командная строка теперь только для Linux, мне придется ее увеличить. И последнее, но не менее важное: я начинаю Qt, я еще не знаю, как работать с внешними API и делать его кроссплатформенным. - person Yassine Zaroui; 12.07.2011
comment
@yzaroui: просто превратите свою текущую реализацию в библиотеку. Затем напишите совершенно новую программу с графическим интерфейсом, которая будет использовать его функции (а набор библиотечных функций по определению является API). - person vines; 12.07.2011
comment
как говорит @vines, вам не нужно управлять ими самостоятельно, превращать их в библиотеку или просто включать все в один проект. Разделение чисто концептуальное. Нет ничего особенного в использовании ни внутренних, ни внешних API, и Qt этого не меняет. - person Fabio Fracassi; 12.07.2011

Вот что я сделал:

void convert(QStringList files, QString destDir) {
    foreach (QString file, files) {
      CImg<unsigned char> image(file.toStdString().c_str());
      QString destFile = destDir + QFileInfo(file).fileName();
      image.get_resize(200, 200, -100, -100, 1).save_jpeg(destFile.toStdString().c_str(), 70);
  }
}

вместо:

QImage img;
foreach (QString file, files) {
img.load(file);
QString destFile = destDir + QFileInfo(file).fileName();
img.scaled(200, 200, Qt::IgnoreAspectRatio, Qt::FastTransformation).save(destFile, 0, 70);
}

Работает в 2-3 раза быстрее

person Yassine Zaroui    schedule 16.07.2011