如何创建一堆图像以快速覆盖两个图像?

时间:2018-07-18 00:18:59

标签: c++ image performance imagemagick cimg

我正在尝试使用ImageMagick GraphicsMagick和CImg,但是它需要10分钟才能完成10,000张图像。

我需要在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 GHz处理器和4 GB RAM。

请帮助我

1 个答案:

答案 0 :(得分:2)

最慢的部分是PNG I / O操作的解码和编码。如果我们可以将 read 操作移至for循环之外,并使用copy constructor克隆图像 data ,那么我们应该能够提高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在CPU线程之间分配工作负载来进一步发展。在我的Mac上,这会在20秒内丢弃10000次迭代。

#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");
    }
}