Как быстро создать группу изображений, наложенных на два изображения?
Я пытаюсь использовать 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");
}
}