Как быстро создать группу изображений, наложенных на два изображения?

Я пытаюсь использовать ImageMagick GraphicsMagick и CImg, но для завершения 10000 изображений требуется 10 минут.

Мне нужно сделать это за 3 минуты.

Как я мог сделать эту задачу быстрее?

Это мой код:

#define cimg_use_png
#define cimg_display 0
#include "CImg.h"
#include <iostream>
#include <vector>

using namespace cimg_library;
int main() {
for (int i = 0; i < 10000; ++i){
   CImg<unsigned char> gradient("gradient.png");
   CImg<unsigned char> overlay("overlay.png");
   gradient.draw_image(80,150,overlay);
   gradient.save_png("result.png");

}
}

Как я мог сделать это быстрее, используя другие библиотеки или другой язык? У меня процессор 2 ГГц и 4 ГБ оперативной памяти.

Помогите мне, пожалуйста

1 ответ

Решение

Самая медленная часть - это декодирование и кодирование операций ввода / вывода PNG. Если мы сможем переместить операции чтения за пределы цикла for и клонировать данные изображения с помощью конструктора копирования, то мы сможем повысить скорость менее чем за 3 минуты.

#define cimg_use_png
#define cimg_display 0
#include "CImg.h"
#include <iostream>
#include <vector>

using namespace cimg_library;

int main() {
    CImg<unsigned char> parent_gradient("gradient.png");
    CImg<unsigned char> parent_overlay("overlay.png");
    for (int i = 0; i < 10000; ++i){
        CImg<unsigned char> gradient(parent_gradient);
        CImg<unsigned char> overlay(parent_overlay);
        gradient.draw_image(80,150,overlay);
        gradient.save_png("result.png");
    }
}

Мы можем пойти дальше, внедрив OpenMP для распределения рабочей нагрузки по потокам ЦП. На моем Mac это сбрасывает 10000 итераций до 20 секунд.

#define cimg_use_png
#define cimg_display 0
#include "CImg.h"
#include <iostream>
#include <vector>

using namespace cimg_library;

int main() {
    CImg<unsigned char> parent_gradient("gradient.png");
    CImg<unsigned char> parent_overlay("overlay.png");
    #pragma omp parallel for
    for (int i = 0; i < 10000; ++i){
        CImg<unsigned char> gradient(parent_gradient);
        CImg<unsigned char> overlay(parent_overlay);
        gradient.draw_image(80,150,overlay);
        gradient.save_png("result.png");
    }
}
Другие вопросы по тегам