Usinfg CImg lib с Qt для более быстрого изменения размера изображения.Стоит ли копать? - PullRequest
3 голосов
/ 12 июля 2011

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 16 июля 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);
  }
}

instread of:

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 раза быстрее

2 голосов
/ 12 июля 2011

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

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

...