Как объединить изображения с помощью 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
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;
}
Оригинальный ответ
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");