繁体   English   中英

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

[英]How can I create a bunch of images overlaying two images quickly?

我正在尝试使用 ImageMagick GraphicsMagick 和 CImg,但完成 10,000 张图像需要 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 Ghz 处理器和 4 GB RAM。

请帮我

最慢的部分是PNG I / O操作的解码和编码。 如果我们可以将读取操作移到for循环之外,并使用copy构造函数克隆图像数据 ,那么我们应该能够在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");
    }
}

你是如何让 png.h 工作的,你需要使用 libpng 吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM