Я ищу алгоритм, который может сделать что-то вроде этого:
Алгоритм должен изменять цвет изображения с прозрачным фоном. Но он должен не только установить цвет как bitmap.SetPixel(x, y, newColor)
. вместо этого он должен уважать тени переднего плана.
В настоящее время я использую следующий алгоритм:
public static Image Foreground(this Image xImage, Color xColor)
{
//FOREGROUND
if (xImage == null) return null;
Bitmap bitmap = new Bitmap(xImage);
//LOOP PIXELS
for (int x = 0; x < bitmap.Width; x++)
for (int y = 0; y < bitmap.Height; y++)
if (bitmap.GetPixel(x, y).A != 0)
{
Color color = bitmap.GetPixel(x, y);
int a = color.A;
int r = Math.Abs(xColor.R - color.R);
int g = Math.Abs(xColor.G - color.G);
int b = Math.Abs(xColor.B - color.B);
bitmap.SetPixel(x, y, Color.FromArgb(a, r, g, b));
}
return bitmap;
}
Хорошо работает, если перекрасить с черного на белый. Но если перекрасить с белого на оранжевый, это не сработает.
Есть ли лучшее решение?