Как заменить маску определенного цвета?

Я использую следующий фрагмент кода, чтобы удалить фон из изображения.

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 как связано ниже.

Оригинал + Маска = Финал

Раньше мне никогда не требовалось ничего, кроме простого белого фона (который это обеспечивает). Теперь я хотел бы иметь возможность установить цвет фона. Я начал с прохождения не (255,255,255) набор цветов в настройках image.Settings.BackgroundColor, Это ничего не достигло. Я пытался исследовать библиотеку MagickImage (через их github у них нет действительно полной документации), но она осталась непостижимой.

Как я мог получить image.Alpha(ImageMagick.AlphaOption.Remove); заменить удаленный участок цветом фона (или переданным цветом) или изменить цвет фона другим способом?

1 ответ

Решение

Решение

Я нашел решение, которое займет у меня 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);

Вместо того, чтобы использовать черно-белую маску и захват альфа-каналов, я преобразую белую часть маски в прозрачную, а затем преобразую черную часть маски в цвета, содержащиеся в bgColors.

Теперь, поскольку ранее белая область теперь прозрачна, я не могу размыть изображение, чтобы создать плавный переход между маской и изображением, который мне все еще нужно исправить.

Другие вопросы по тегам