我正在寻找能够执行以下操作的算法:
该算法应更改具有透明背景的图像的颜色。但它不仅应设置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;
}
如果从黑色重新绘制为白色,效果很好。但是,如果您从白色重新涂成橙色,效果不好。
有更好的解决方案吗?