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

How do you replace a mask with a specific color?

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

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);用背景颜色(或传递的颜色)替换删除的部分,或者以其他方式更改背景颜色?

解决方案

我找到了一个解决方案,可以解决 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);

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

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