Я попробовал решение Mario, и оно сработало отлично, но для меня это немного медленно. Я искал другое решение и нашел проект, в котором используется более эффективный метод. Github публикует GreenScreen
Этот проект берет папку и обрабатывает все файлы, мне просто нужно изображение, поэтому я сделал это:
private Bitmap RemoveBackground(Bitmap input)
{
Bitmap clone = new Bitmap(input.Width, input.Height, PixelFormat.Format32bppArgb);
{
using (input)
using (Graphics gr = Graphics.FromImage(clone))
{
gr.DrawImage(input, new Rectangle(0, 0, clone.Width, clone.Height));
}
var data = clone.LockBits(new Rectangle(0, 0, clone.Width, clone.Height), ImageLockMode.ReadWrite, clone.PixelFormat);
var bytes = Math.Abs(data.Stride) * clone.Height;
byte[] rgba = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(data.Scan0, rgba, 0, bytes);
var pixels = Enumerable.Range(0, rgba.Length / 4).Select(x => new {
B = rgba[x * 4],
G = rgba[(x * 4) + 1],
R = rgba[(x * 4) + 2],
A = rgba[(x * 4) + 3],
MakeTransparent = new Action(() => rgba[(x * 4) + 3] = 0)
});
pixels
.AsParallel()
.ForAll(p =>
{
byte max = Math.Max(Math.Max(p.R, p.G), p.B);
byte min = Math.Min(Math.Min(p.R, p.G), p.B);
if (p.G != min && (p.G == max || max - p.G < 7) && (max - min) > 20)
p.MakeTransparent();
});
System.Runtime.InteropServices.Marshal.Copy(rgba, 0, data.Scan0, bytes);
clone.UnlockBits(data);
return clone;
}
}
Не забудьте избавиться от входного растрового изображения и возврата этого метода. Если вам нужно сохранить изображение, просто используйте инструкцию Save Bitmap.
clone.Save(@"C:\your\folder\path", ImageFormat.Png);
Здесь вы можете найти методы для еще более быстрой обработки изображения.Быстрая обработка изображений в C#
person
Francesc MP
schedule
12.11.2018