在c#中替换图像中的颜色

在不影响纹理的情况下,C#替换图像某些部分的颜色的方式是什么?

你可以在这里看到结果的好例子
谢谢

有效替换颜色的一种方法是使用重映射表。 在以下示例中,将在图片框内绘制图像。 在Paint事件中,Color.Black的颜色更改为Color.Blue:

private void pictureBox_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; using (Bitmap bmp = new Bitmap("myImage.png")) { // Set the image attribute's color mappings ColorMap[] colorMap = new ColorMap[1]; colorMap[0] = new ColorMap(); colorMap[0].OldColor = Color.Black; colorMap[0].NewColor = Color.Blue; ImageAttributes attr = new ImageAttributes(); attr.SetRemapTable(colorMap); // Draw using the color map Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); g.DrawImage(bmp, rect, 0, 0, rect.Width, rect.Height, GraphicsUnit.Pixel, attr); } } 

更多信息: http : //msdn.microsoft.com/en-us/library/4b4dc1kz%28v=vs.110%29.aspx

试试这个:

 Color color = Color.Black; //Your desired colour byte r = color.R; //For Red colour Bitmap bmp = new Bitmap(this.BackgroundImage); for (int x = 0; x < bmp.Width; x++) { for (int y = 0; y < bmp.Height; y++) { Color gotColor = bmp.GetPixel(x, y); gotColor = Color.FromArgb(r, gotColor.G, gotColor.B); bmp.SetPixel(x, y, gotColor); } } 

找到了这样做的方法,这需要RGB < - > HSL转换(HSL颜色的好类可以在这里找到)
1.获取表示要替换的颜色的参考值(以hsl为单位)
2.获取目标颜色的hsl值
3.获取图像像素和每个像素:
4.计算像素的hsl值,并将其替换为(pixelHsl / refHsl)* targetHsl

这对我来说很有帮助,感谢所有帮助过的人

尝试读出像素并将它们填充在3个数组(rgb)中,您可以在算法中设置它来替换您的颜色。

在做研究时,我发现没有有效/平滑的方式这样做,所以我不自己,代码可以清理ALOT但它完成工作,它没有效率但它更顺畅,允许你设置容差。

 public static Image ColorReplace(this Image inputImage, int tolerance, Color oldColor, Color NewColor) { Bitmap outputImage = new Bitmap(inputImage.Width, inputImage.Height); Graphics G = Graphics.FromImage(outputImage); G.DrawImage(inputImage, 0, 0); for (Int32 y = 0; y < outputImage.Height; y++) for (Int32 x = 0; x < outputImage.Width; x++) { Color PixelColor = outputImage.GetPixel(x, y); if (PixelColor.R > oldColor.R - tolerance && PixelColor.R < oldColor.R + tolerance && PixelColor.G > oldColor.G - tolerance && PixelColor.G < oldColor.G + tolerance && PixelColor.B > oldColor.B - tolerance && PixelColor.B < oldColor.B + tolerance) { int RColorDiff = oldColor.R - PixelColor.R; int GColorDiff = oldColor.G - PixelColor.G; int BColorDiff = oldColor.B - PixelColor.B; if (PixelColor.R > oldColor.R) RColorDiff = NewColor.R + RColorDiff; else RColorDiff = NewColor.R - RColorDiff; if (RColorDiff > 255) RColorDiff = 255; if (RColorDiff < 0) RColorDiff = 0; if (PixelColor.G > oldColor.G) GColorDiff = NewColor.G + GColorDiff; else GColorDiff = NewColor.G - GColorDiff; if (GColorDiff > 255) GColorDiff = 255; if (GColorDiff < 0) GColorDiff = 0; if (PixelColor.B > oldColor.B) BColorDiff = NewColor.B + BColorDiff; else BColorDiff = NewColor.B - BColorDiff; if (BColorDiff > 255) BColorDiff = 255; if (BColorDiff < 0) BColorDiff = 0; outputImage.SetPixel(x, y, Color.FromArgb(RColorDiff, GColorDiff, BColorDiff)); } } return outputImage; }