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

How to combine images using MagickWand C API?

我有两张图片,我想将它们组合在一起,类似的命令是 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;
}

这些是图片。

one.png

two.png

finalResultUsingCMd.png

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

更新答案

除了捕获组合结果外,您还需要在应用 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;
}

原答案

MagickCombineImages 方法应该 return 一个包含合并操作结果的指针 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");