Я пытаюсь преобразовать команду ImageMagick для маски размытия в Magick ++ API.

ImageMagick :

convert -size 720x478 xc: -sparse-color Barycentric '0,0 black 0,%h white' -function polynomial 4,-4,1 -level 0,50% mask.jpg

Магия ++ :

Magick::Image mask(Magick::Geometry(720,478), Magick::Color("white"));

double args[6];
args[0] = 0;
args[1] = 0;
args[2] = 0;
args[3] = 0;
args[4] = mask.rows();
args[5] = MaxRGB;

mask.sparseColor(Magick::DefaultChannels, Magick::BarycentricColorInterpolate, 6, args);

args[0] = 4;
args[1] = -4;
args[2] = 1;
args[3] = 0;
args[4] = 0;
args[5] = 0;

mask.quantumOperator(Magick::DefaultChannels, Magick::PolynomialFunction,
    3,args);

parseLevel(image, "0,50%", args); // contains code from mogrify.c for parsing the leveling string

mask.level(args[0], args[1], args[2], ' ');

В результате я получаю просто белое изображение, тогда как правильное изображение маски должно быть таким:

enter image description here

Может, кто-нибудь покажет мне мою ошибку?

0
zindarod 7 Янв 2016 в 12:17

2 ответа

Лучший ответ

Получается, что я неправильно указывал ChannelType в функции sparseColor(). Перечисление DefaultChannels содержит RGBChannels с OpacityChannel и IndexChannel. Мне пришлось исключить два последних из перечисления DefaultChannels с помощью побитовой операции. Как отметил @ThorngardSO, размер аргументов также должен быть 10.

код :

double args[10];

// -sparse-color Barycentric '0,0 black 0,%h white' 

args[0] = 0;           // x = 0
args[1] = 0;           // y = 0
args[2] = 0;           // black (R)
args[3] = 0;           // black (G)
args[4] = 0;           // black (B)
args[5] = 0;           // x = 0
args[6] = mask.rows(); // y = %h
args[7] = MaxRGB;      // white (R)
args[8] = MaxRGB;      // white (G)
args[9] = MaxRGB;      // white (B)

mask.sparseColor((Magick::DefaultChannels & ~OpacityChannel) & ~IndexChannel, Magick::BarycentricColorInterpolate, 10, args);
0
zindarod 8 Янв 2016 в 07:27

Ммм, у меня нет опыта работы с imagemagick, но быстро заглянув в документацию и на ваш пример, я догадываюсь: возможно, тип изображения по умолчанию - rgb, и вам нужно три параметра float / double для каждого цвета в вашем вызове sparse-color . Как это:

Magick::Image mask(Magick::Geometry(720,478), Magick::Color("white"));

double args[10];

// -sparse-color Barycentric '0,0 black 0,%h white' 

args[0] = 0;           // x = 0
args[1] = 0;           // y = 0
args[2] = 0;           // black (R)
args[3] = 0;           // black (G)
args[4] = 0;           // black (B)
args[5] = 0;           // x = 0
args[6] = mask.rows(); // y = %h
args[7] = MaxRGB;      // white (R)
args[8] = MaxRGB;      // white (G)
args[9] = MaxRGB;      // white (B)

mask.sparseColor(Magick::DefaultChannels, Magick::BarycentricColorInterpolate, 10, args);
1
ThorngardSO 7 Янв 2016 в 09:44