【问题标题】:How can I create a bunch of images overlaying two images quickly?如何快速创建一堆覆盖两个图像的图像?
【发布时间】:2018-07-18 00:18:58
【问题描述】:

我正在尝试使用 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。

请帮帮我

【问题讨论】:

  • 尝试使用多个线程。一个线程将图像读入缓冲区。线程 2 对新缓冲区执行覆盖。线程 3 将覆盖图像写入文件。调整缓冲区大小以优化速度。
  • 根据文档 (cimg.eu/CImg_reference.pdf),CImg 似乎可以使用并行编程库 OpenMP。可能想调查一下。
  • 将渐变保存到 MPC(内存映射格式)一次。然后读取以覆盖相同的渐变会更快。见imagemagick.org/Usage/files/#mpc

标签: c++ image performance imagemagick cimg


【解决方案1】:

最慢的部分是 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");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2014-11-14
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多