2015-04-08 2 views
0

Учитывая изображение, я хочу преобразовать его пиксели рядом с указанным цветом, например Color.FromArgb(210, 189, 51), в прозрачную область.Изменить прозрачные пиксели заданного цвета

Я попытался это:

public Bitmap MakeTransparent(Image image,Color clr) 
{ 
    Bitmap b = new Bitmap(image); 

    var replacementColour = Color.FromArgb(255, 255, 255); 
    var tolerance = 1; 

    for (int i = b.Size.Width - 1; i >= 0; i--) 
    { 
     for (int j = b.Size.Height - 1; j >= 0; j--) 
     { 
      var col = b.GetPixel(i, j); 

      if (clr.R - col.R < tolerance && 
       clr.G - col.G < tolerance && 
       clr.B - col.B < tolerance) 
      { 
       b.SetPixel(i, j, replacementColour); 
      } 
     } 
    } 

    b.MakeTransparent(replacementColour); 

    return b; 
} 

Но результат не так.

+0

Вы указали, что вы пробовали, но забыли указать, какие проблемы вы столкнулись. Так в чем проблема? –

+0

Код не работает должным образом, он также преобразует в прозрачную область неуказанные цвета. –

ответ

1

Вы должны узнать о metrics.

Во всяком случае, если плохие цвета преобразуются это очевидно из-за тест:

if (clr.R - col.R < tolerance && clr.G - col.G < tolerance && clr.B - col.B < tolerance) 

Если clr это сказать (100,100,100) (light gray) любой цвет с RGB меньше, чем 99 будет проходить тест. Как (75,57,37) (dark shitty brown) ...

Вы можете использовать Math.Abs:

if (Math.Abs(clr.R - col.R) < tolerance && 
    Math.Abs(clr.G - col.G) < tolerance && 
    Math.Abs(clr.B - col.B) < tolerance) 

Как замечание, если tolerance является 1 вы проверить Math.Abs(d) < 1 что эквивалентно d == 0. Поэтому, если допуск равен 1, вы фактически проверяете равенство цвета.

Вы можете использовать:

if (Math.Abs(clr.R - col.R) <= tolerance && 
    Math.Abs(clr.G - col.G) <= tolerance && 
    Math.Abs(clr.B - col.B) <= tolerance) 

В этом случае проверьте цвета равенства при tolerance равно 0.

Кроме того, вы должны сразу установить соответствие пикселы прозрачные, а не установить его на белый и использовать предыдущую функцию:

var replacementColour = Color.Transparent; 

... // for loops 

if (Math.Abs(clr.R - col.R) < tolerance && 
    Math.Abs(clr.G - col.G) < tolerance && 
    Math.Abs(clr.B - col.B) < tolerance) 
{ 
    b.SetPixel(i, j, replacementColour); 
} 

Выполнение этого не может быть хорошим способа, как и цветовых расстояния является большой темой. Вы должны знать о том, что:

+0

Это просто работает, как если (clr == col), он преобразует только точный цвет только не рядом со всеми цветами. –

+0

Это толерантность '1' действительно вы проверяете на равенство. Вы можете использовать '<=' вместо '<' или использовать больший допуск для захвата большего количества цветов. – Orace

+0

отлично работает. Можете ли вы предложить, каков минимальный и максимальный лимит допустимости? –

Смежные вопросы