Результат ImageMagick отличается от Magick++

У меня есть 3 изображения: source.jpg, nasat.jpg и mask.jpg, я хочу смешать source.jpg и saturated.jpg с помощью файла mask.jpg.

Когда я использую команду ImageMagick convert:

convert source.jpg saturated.jpg mask.jpg -compose over -composite result.jpg

Я получаю этот результат.

Но когда я делаю то же самое с Magick++:

Magick::Image source,saturated,mask;
source.read("source.jpg");
saturated.read("saturated.jpg");
mask.read("mask.jpg");
source.clipMask(mask);
source.composite(saturated,0,0,OverCompositeOp);

Я получаю этот результат.

Может ли кто-нибудь сказать мне, что я делаю неправильно?


person zindarod    schedule 17.12.2015    source источник
comment
@emcconville Если бы вы могли взглянуть на этот вопрос, пожалуйста.   -  person zindarod    schedule 17.12.2015
comment
Я совершенно уверен, что вам нужно преобразовать mask в оттенки серого, прежде чем использовать его, и, возможно, добавить подложку (альфа-канал) к source и, возможно, инвертировать маску, так что, по крайней мере, первая и, возможно, вторая и третья из следующих строк. .. mask.type( Magick::GrayscaleType ); и source.matte(true); и mask.negate();.   -  person Mark Setchell    schedule 17.12.2015
comment
Альфа-канал @MarkSetchell не имеет к этому никакого отношения, поскольку и исходное, и насыщенное изображения являются jpeg, и я просто добавляю одно поверх другого. Маска не должна быть инвертирована, потому что это поменяет местами белые и черные области, а изображение маски здесь используется как руководство к тому, какие пиксели в насыщенном изображении следует использовать, а какие нет.   -  person zindarod    schedule 17.12.2015


Ответы (1)


Это довольно близко к версии командной строки:

#include <Magick++.h> 
#include <iostream> 
using namespace std; 
using namespace Magick; 

int main(int argc,char **argv) 
{ 
   InitializeMagick(*argv);
   Magick::Image source,saturated,mask;
   source.read("source.jpg");
   saturated.read("saturated.jpg");
   mask.read("mask.jpg");
   mask.type( Magick::GrayscaleType );
   mask.negate();
   source.mask(mask);
   source.composite(saturated,0,0,OverCompositeOp);
   source.write("mppresult.jpg");
}
person Mark Setchell    schedule 17.12.2015
comment
Спасибо за ответ. Моя ошибка заключалась в том, что я использовал clipMask() вместо mask(). Потому что функция mask() не существует в документации. :) А во-вторых, я не понимаю, почему вы отрицаете маску. Отменяет ли ImageMagick маски внутри? - person zindarod; 17.12.2015
comment
Извините, я не знаю - я уступлю Эрику (@emcconville), который должен знать. - person Mark Setchell; 17.12.2015
comment
Спасибо за ваше время. - person zindarod; 17.12.2015
comment
Отличный ответ Марк! Zindarod, clipMask и mask используются во многих подпрограммах кеша пикселей, и, возможно, поэтому документацию легко запутать. clipMask и clipPath более специфичны для виртуальных пикселей и задач рисования. Метод mask подходит для вашего приложения. Другим вариантом было бы скомпоновать CopyOpacityCompositeOp поверх изображения saturated, но подход Марка чище (т. е. вам легче запомнить, что делает код). - person emcconville; 17.12.2015
comment
@emcconville Спасибо за объяснение. - person zindarod; 18.12.2015
comment
@MarkSetchell Знаете ли вы, как переносить аннотации в слова в Magick ++? Я могу опубликовать код, который я сделал до сих пор, если вам нужно. - person zindarod; 18.12.2015
comment
@emcconville Приведенный выше вопрос и для вас, если у вас есть время, пожалуйста. - person zindarod; 18.12.2015
comment
Просто опубликуйте новый вопрос - вопросы бесплатны :-) - person Mark Setchell; 18.12.2015
comment
@MarkSetchell stackoverflow.com/questions/34352420/ - person zindarod; 18.12.2015