C++ 动画gif上的ImageMagick文本水印 //在动画gif上添加文本水印 std::向量imglist; std::向量文本列表; 文本列表。向后推(DrawableText(0,0,“我爱你!”); 文本列表。向后推(DrawableStrokeColor(颜色(“黑色”)); 试一试{ readImages(&imglist,“test.gif”); 对于(uint32_t i=0;i

C++ 动画gif上的ImageMagick文本水印 //在动画gif上添加文本水印 std::向量imglist; std::向量文本列表; 文本列表。向后推(DrawableText(0,0,“我爱你!”); 文本列表。向后推(DrawableStrokeColor(颜色(“黑色”)); 试一试{ readImages(&imglist,“test.gif”); 对于(uint32_t i=0;i,c++,image,imagemagick,gif,C++,Image,Imagemagick,Gif,您可以通过利用 std::向量imglist; DrawableList text_list;//我找到了一种可能的方法。我们可以根据@emcconville的上述答案并行化程序。但我们必须并行化成本操作,即量化。下面是代码: //add text watermark on animated gif std::vector<Image> imglist; std::vector<Drawable> text_list; text_list.push_back( Drawa

您可以通过利用

std::向量imglist;

DrawableList text_list;//我找到了一种可能的方法。我们可以根据@emcconville的上述答案并行化程序。但我们必须并行化成本操作,即量化。下面是代码:

//add text watermark on animated gif
std::vector<Image> imglist;
std::vector<Drawable> text_list;
text_list.push_back( DrawableText(0, 0, “I love you!"));
text_list.push_back( DrawableStrokeColor(Color("black")));
try {
    readImages(&imglist, "test.gif");
    for (uint32_t i = 0; i < imglist.size(); ++i) {
        imglist[i].font("./MILT_RG.ttf");
        imglist[i].draw(text_list);
    }
    writeImages(imglist.begin(), imglist.end(), "test_render.gif");
} catch (Exception &error_) {

    cout << error_.what() << endl;
}
#pragma omp parallel for
对于(size_t i=0;i
只是疯狂猜测,直到Eric稍后上线,但你可以尝试在透明画布上只写一次文本,然后在20帧中的每一帧上进行合成…在我的测试中,绘制文本的循环要花费100毫秒多一点,而writeImages操作要花费1300毫秒多一点。瓶颈可能是writeImages。你知道原因吗?@Yang你可以试着在
tmpfs
或RAMdrive文件系统上写,看看是不是一个慢磁盘导致了你的问题。另一种可能是,IM可能正试图在所有20帧中优化你的调色板…@emcconville慢磁盘不是问题所在,因为我试过这样做在一个blob中写入图像,速度也很慢。你的后一个猜测可能是对的。有没有办法验证它并进行一些优化?
#pragma omp parallel for
for (size_t i = 0; i < imglist.size(); ++i) {
imglist[i].font("./MILT_RG.ttf");
imglist[i].draw(text_list);
imglist[i].quantize(false);
}