1

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

在此处输入图像描述 二.png

在此处输入图像描述 finalResultUsingCMd.png

在此处输入图像描述

merge.png (我使用 C 代码获得的这张图片。但我想要上面的图片。) 在此处输入图像描述

4

1 回答 1

1

更新的答案

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

引用一些文件...

在使用任何使用 MagickAddImage() 或 MagickReadImage() 添加到魔杖的图像后,将在魔杖中的任何图像之前添加。

此外,当前图像已设置为 Magick Wand 中的第一张图像(如果有)。然后使用 MagickNextImage() 将当前图像设置为列表中的第二个图像(如果存在)。

此操作类似于 MagickResetIterator(),但不同的是 MagickAddImage()、MagickReadImage() 和 MagickNextImage() 之后的行为方式。

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

#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;
}

merge.png 的副本

原始答案

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

// 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");

合并.png

于 2017-04-25T15:41:45.710 回答