Magick++ 模糊蒙版
Magick++ blur mask
我正在尝试将用于模糊蒙版的 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++:
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], ' ');
我得到的结果只是一个白色图像,而正确的蒙版图像应该是这样的:
有人可以告诉我我的错误吗?
嗯,我没有使用 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);
原来我在 sparseColor()
函数中给出了错误的 ChannelType
。 DefaultChannels
枚举包含 RGBChannels
以及 OpacityChannel
和 IndexChannel
。我不得不通过按位运算将后两者从 DefaultChannels 枚举中排除。正如@ThorngardSO 指出的那样,args 大小也需要为 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);
我正在尝试将用于模糊蒙版的 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++:
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], ' ');
我得到的结果只是一个白色图像,而正确的蒙版图像应该是这样的:
有人可以告诉我我的错误吗?
嗯,我没有使用 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);
原来我在 sparseColor()
函数中给出了错误的 ChannelType
。 DefaultChannels
枚举包含 RGBChannels
以及 OpacityChannel
和 IndexChannel
。我不得不通过按位运算将后两者从 DefaultChannels 枚举中排除。正如@ThorngardSO 指出的那样,args 大小也需要为 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);