Как объединить изображения с помощью 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 (Это изображение, которое я получаю, используя код на Си. Но я хочу изображение выше.) введите описание изображения здесь

1 ответ

Решение

Обновленный ответ

В дополнение к получению результатов комбинирования вам необходимо сбросить итератор палочки перед применением MagickCombineImages, Это потому, что каждый раз, когда вы вызываете MagickAddImage внутренний связанный список указывает на вновь добавленный узел. (Надеюсь, я объяснил это ясно.)

Цитирую некоторые документы...

После использования любых изображений, добавленных в палочку, с помощью MagickAddImage() или MagickReadImage() будет добавлено перед любым изображением в палочке.

Также текущее изображение было установлено на первое изображение (если есть) в Волшебной палочке. Использование 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 метод должен возвращать указатель 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

Другие вопросы по тегам