C++ 如何快速创建一组覆盖两个图像的图像?

C++ 如何快速创建一组覆盖两个图像的图像?,c++,image,performance,imagemagick,cimg,C++,Image,Performance,Imagemagick,Cimg,我尝试使用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() { f

我尝试使用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");

}
}
#定义cimg_使用_png
#定义cimg_显示0
#包括“CImg.h”
#包括
#包括
使用名称空间cimg_库;
int main(){
对于(int i=0;i<10000;++i){
CImg梯度(“gradient.png”);
cimgoverlay(“overlay.png”);
梯度。绘制_图像(80150,叠加);
gradient.save_png(“result.png”);
}
}
如何使用其他库或其他语言更快地完成此任务?我有一个2GHz处理器和4GB内存


请帮助我

最慢的部分是PNG i/o操作的解码和编码。如果我们可以将读取操作移到for循环之外,并使用克隆图像数据,那么我们应该能够在3分钟内提高速度

#定义cimg_使用_png
#定义cimg_显示0
#包括“CImg.h”
#包括
#包括
使用名称空间cimg_库;
int main(){
CImg parent_gradient(“gradient.png”);
CImg parent_overlay(“overlay.png”);
对于(int i=0;i<10000;++i){
CImg梯度(母体梯度);
CImg覆盖(父覆盖);
梯度。绘制_图像(80150,叠加);
gradient.save_png(“result.png”);
}
}
通过实现将工作负载分布到CPU线程,我们可以走得更远。在我的mac电脑上,这会将10000次迭代降低到20秒以下

#定义cimg_使用_png
#定义cimg_显示0
#包括“CImg.h”
#包括
#包括
使用名称空间cimg_库;
int main(){
CImg parent_gradient(“gradient.png”);
CImg parent_overlay(“overlay.png”);
#pragma-omp并行
对于(int i=0;i<10000;++i){
CImg梯度(母体梯度);
CImg覆盖(父覆盖);
梯度。绘制_图像(80150,叠加);
gradient.save_png(“result.png”);
}
}

尝试使用多线程。一个线程将图像读入缓冲区。线程2执行对新缓冲区的覆盖。线程3将覆盖图像写入文件。调整缓冲区大小以优化速度。基于docs(),CImg似乎可以使用OpenMP,一个并行编程库。也许你想看看。把你的梯度保存到MPC(内存映射格式)一次。然后,读回用于叠加相同渐变的内容会快得多。看见