【问题标题】:Magick++ blur maskMagick++ 模糊蒙版
【发布时间】:2016-04-11 14:44:50
【问题描述】:

我正在尝试将用于模糊蒙版的 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], ' ');

我得到的结果只是一张白色的图像,而正确的蒙版图像应该是这样的:

谁能告诉我我的错误?

【问题讨论】:

    标签: c++ image-processing imagemagick blur magick++


    【解决方案1】:

    嗯,我没有使用 imagemagick 的经验,但是快速查看文档并在您的示例中,我有一个预感:也许默认图像类型是 rgb,并且您的稀疏中的每种颜色都需要三个浮点/双精度参数-颜色调用。像这样:

    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);
    

    【讨论】:

    • 我已经尝试了 12 个参数,x,y 和 r,g,b,a 但我得到了和以前一样的结果。有 10 个参数,它会抛出无效参数的异常。
    • 好的,抱歉。那么剩下的就是最后一个建议:把你的例子分解成最小的部分,找出罪魁祸首是什么函数。 IOW:如果你注释掉quantumOperator() 和level(),得到的掩码看起来合理吗?如果是,请再次添加quantumOperator()。等等……
    【解决方案2】:

    所以事实证明我在sparseColor() 函数中给出了错误的ChannelTypeDefaultChannels 枚举包含 RGBChannelsOpacityChannelIndexChannel。我不得不通过按位运算从 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);
    

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多