待处理的图片,其特征是包含有限数量颜色,不同的颜色相互交叉使用,相同颜色并未完全连贯,需要将图片中的指定颜色替换为另一颜色。虽然很多图片处理工具都支持类似操作,最后还是自己动手编写简单的处理程序。
   程序的功能主要包括:1)一对一颜色替换,仅替换颜色RGB值等于指定颜色的像素;2)范围替换,替换颜色RGB值与指定颜色相距不超过指定距离的像素。
   获取图片像素和设置图片像素使用的是Bitmap类的GetPixel和SetPixel函数,计算像素与像素的距离使用的是三维坐标距离计算公式,如下图所示(参考文献1)。
 
   关键代码如下所示:
Bitmap curImage = picSrcImage.Image as Bitmap;
Color curColor;
//源颜色,待替换颜色
Color colorSource = Color.FromArgb(Convert.ToByte(nudR.Value), Convert.ToByte(nudG.Value), Convert.ToByte(nudB.Value));
//目标颜色
Color colorDest = Color.FromArgb(Convert.ToByte(nudDR.Value), Convert.ToByte(nudDG.Value), Convert.ToByte(nudDB.Value));
//一对一替换像素
for (int i = 0; i < curImage.Width; i++)
{
    for (int j = 0; j < curImage.Height; j++)
    {
        curColor = curImage.GetPixel(i, j);
        if ((curColor.R == Convert.ToByte(nudR.Value)) &&
            (curColor.G == Convert.ToByte(nudG.Value)) &&
            (curColor.B == Convert.ToByte(nudB.Value)))
        {
            curImage.SetPixel(i, j, colorDest);
        }
    }
}
//范围替换像素
for (int i = 0; i < curImage.Width; i++)
{
    for (int j = 0; j < curImage.Height; j++)
    {
        curColor = curImage.GetPixel(i, j);
        if (CalculateDistance(curColor, colorSource) <= Convert.ToDouble(nudRange.Value))
        {
            curImage.SetPixel(i, j, colorDest);
        }
    }
}
  最后是程序运行效果,导入原始图片后,将右上角的BALL字符内部的红色替换为蓝色,如下图所示。
 
 
 参考文献:
 [1]https://zhidao.baidu.com/question/1312602947632691539.html



















