gpt4 book ai didi

c - 如何使用 MagickWand C API 组合图像?

转载 作者:太空宇宙 更新时间:2023-11-04 03:23:07 31 4
gpt4 key购买 nike

我有两个图像,我想将它们组合在一起,类似的命令是 convert one.png two.png +clone -combine displaceMask.png。下面是我的 C 代码。我使用 C 没有得到完美的结果。

#include <stdio.h>
#include "MagickWand/MagickWand.h"
int main(int argc, const char * argv[]) {

MagickWand *wand1, *wand2, *wand3;

wand1 = NewMagickWand();
wand2 = NewMagickWand();
wand3 = NewMagickWand();

MagickReadImage(wand1, "one.png");
MagickReadImage(wand2, "two.png");

// convert one.png two.png +clone -combine displaceMask.png
wand3 = CloneMagickWand(wand2);
MagickAddImage(wand1, wand2);
MagickAddImage(wand1, wand3);
MagickCombineImages(wand1,RGBColorspace);
MagickWriteImage(wand1,"merge.png");

if(wand1)wand1 = DestroyMagickWand(wand1);
if(wand2)wand2 = DestroyMagickWand(wand2);
if(wand3)wand3 = DestroyMagickWand(wand3);
MagickWandTerminus();

return 0;
}

这些是图片。

一个.png

enter image description here二.png

enter image description here最终结果使用CMd.png

enter image description here

merge.png(我使用 C 代码得到的这张图片。但我想要上面的图片。) enter image description here

最佳答案

更新的答案

除了捕获组合结果外,您还需要在应用 MagickCombineImages 之前重置魔杖迭代器。这是因为每次调用 MagickAddImage 时,内部链表都指向新添加的节点。 (希望我解释清楚了。)

引用一些文档...

After using any images added to the wand using MagickAddImage() or MagickReadImage() will be prepended before any image in the wand.

Also the current image has been set to the first image (if any) in the Magick Wand. Using MagickNextImage() will then set teh current image to the second image in the list (if present).

This operation is similar to MagickResetIterator() but differs in how MagickAddImage(), MagickReadImage(), and MagickNextImage() behaves afterward.

所以你的示例代码应该看起来像......

#include "MagickWand/MagickWand.h"
int main(int argc, const char * argv[]) {

MagickWand
*wand1,
*wand2,
*wand3,
*result;

wand1 = NewMagickWand();
wand2 = NewMagickWand();

MagickReadImage(wand1, "one.png");
MagickReadImage(wand2, "two.png");

// convert one.png two.png +clone -combine displaceMask.png
wand3 = CloneMagickWand(wand2);
MagickAddImage(wand1, wand2);
MagickAddImage(wand1, wand3);
MagickSetFirstIterator(wand1);
result = MagickCombineImages(wand1, MagickGetImageColorspace(wand1));
MagickWriteImage(result,"merge.png");

wand1 = DestroyMagickWand(wand1);
wand2 = DestroyMagickWand(wand2);
wand3 = DestroyMagickWand(wand3);
result = DestroyMagickWand(result);
MagickWandTerminus();

return 0;
}

copy of merge.png

原始答案

MagickCombineImages 方法应该返回一个指针 MagickWand * ,其中包含合并操作的结果。 此方法的行为在 IM 6 和 IM 7 的版本之间发生了变化,因此很可能存在错误,或者实现已调整。我目前不在 IM 7 附近进行验证,但这里有一个解决方法。

// convert one.png two.png +clone -combine displaceMask.png
wand3 = CloneMagickWand(wand2);
MagickCompositeImage(wand1, wand2, CopyGreenCompositeOp, MagickTrue, 0, 0);
MagickCompositeImage(wand1, wand3, CopyBlueCompositeOp, MagickTrue, 0, 0);
MagickWriteImage(wand1, "merge.png");

merge.png

关于c - 如何使用 MagickWand C API 组合图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43611379/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com