如何更换特定颜色的面膜?

时间:2018-01-09 23:00:50

标签: c# imagemagick.net

我正在使用以下代码段从图片中删除背景。

int[] bgColors = {203,255,240}
ImageMagick.MagickImage image = new ImageMagick.MagickImage("input.jpg")
ImageMagick.MagickImage combineMask= new ImageMagick.MagickImage("mask.jpg")

combineMask.Blur(7, 30);

image.Composite(combineMask, ImageMagick.CompositeOperator.CopyAlpha);
image.Settings.BackgroundColor = new ImageMagick.MagickColor(bgColors[0], bgColors[1], bgColors[2]);
image.Alpha(ImageMagick.AlphaOption.Remove);

需要MagickImage image和MagickImage combineMask并输出合并后的image

Original + Mask = Final

以前,我从不需要除纯白色背景之外的任何东西(这是提供的)。现在,我希望能够设置背景的颜色。我首先将非(255,255,255)组颜色传递给设置为image.Settings.BackgroundColor。这没有任何成就。我一直在尝试调查MagickImage库(通过他们的github,他们真的没有完整的文档),但它仍然是不可理解的。

我如何让image.Alpha(ImageMagick.AlphaOption.Remove);用背景颜色(或传递的颜色)替换删除的部分,或以其他方式更改背景的颜色?

1 个答案:

答案 0 :(得分:0)

<强>解决方案

我找到了一个解决方案,它占据了我90%的路程。

int[] bgColors = {203,255,240}
ImageMagick.MagickImage image = new ImageMagick.MagickImage("input.jpg")
ImageMagick.MagickImage combineMask= new ImageMagick.MagickImage("mask.jpg")

combineMask.ColorFuzz = new ImageMagick.Percentage(5);

combineMask.Transparent(ImageMagick.MagickColor.FromRgb(255, 255, 255));
combineMask.Opaque(ImageMagick.MagickColor.FromRgb((byte)0, (byte)0, (byte)0), 
ImageMagick.MagickColor.FromRgb((byte)bgColors[0], (byte)bgColors[1], (byte)bgColors[2]));

image.Composite(combineMask, ImageMagick.CompositeOperator.Over);

我没有使用黑/白面具并抓取alpha通道,而是将蒙版的白色部分转换为透明,然后将蒙版的黑色部分转换为bgColors中包含的颜色。

现在,由于以前的白色区域现在是透明的,我无法模糊图像,以便在蒙版和图片之间创建平滑过渡,我仍然需要修复。