¿Cuál es el camino en C# para reemplazar un color de algunas partes de una imagen sin afectar su textura?reemplazar el color en una imagen en C#
Se puede ver un buen ejemplo del resultado here
Gracias
¿Cuál es el camino en C# para reemplazar un color de algunas partes de una imagen sin afectar su textura?reemplazar el color en una imagen en C#
Se puede ver un buen ejemplo del resultado here
Gracias
encontrado la manera de hacerlo, esto requiere RGB < - conversiones> HSL (buena clase para el color HSL se puede encontrar here)
1. obtener un valor de referencia (en HSL) que representan el color que desea reemplazar
2. Obtener el valor HSL para su color de destino
3. píxeles y así tener una imagen para cada píxel:
4. Calcular el valor HSL del píxel, y reemplazarlo con (pixelHsl/refHsl) * targetHsl
Esto hizo el trabajo por mí, gracias a todos los que ayudaron
intente esto:
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);
}
}
'GetPixel' es muy lento, ver: http://stackoverflow.com/questions/4235731/is-there-a-faster-alternative-to-gdi-getpixel –
sí no es muy rápido, pero para el cambio de color de las imágenes pequeñas es muy efectivo. –
El único problema con el cambio de colores de una imagen es que no es selectivo. es decir, en una imagen que desea cambiar de negro a rojo en una determinada parte, no es posible. por ejemplo, si en una imagen de persona quieres cambiar los colores del cabello a rojo, entonces no es posible. reemplazará todos los píxeles negros con rojo, sin importar dónde aparezcan en la imagen. –
tratar de leer a al los píxeles y meterlos en un 3 de array (RGB) no se puede establecer en un alogrithm para reemplazar sus colores.
Hola, gracias, sin embargo, esto no es relevante para lo que necesito. Lo que realmente necesito es aplicar un reemplazo de un color en una imagen de una manera que mantendrá la textura – Oren
que es igual a somme, la textura es solo una variación en colores. como el cielo azul y una nube blanca puede ser un cielo púrpura y una nube algo más oscura de color púrpura o algo así. – jorne
Una manera de reemplazar eficientemente un color es utilizar una tabla de reasignación. En el siguiente ejemplo, se dibuja una imagen dentro de un cuadro de imagen. En el caso de la pintura, el color de Color.Black se cambia a 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);
}
}
Más información: http://msdn.microsoft.com/en-us/library/4b4dc1kz%28v=vs.110%29.aspx
Al hacer la investigación he encontrado ninguna eficiente/smoothe forma de hacer esto, así que no se yo mismo, el código podría limpiarse MUCHO, pero hace el trabajo, no es eficiente, pero es más suave y te permite establecer una tolerancia.
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;
}
Sí, funciona como un amuleto. ¿Podría comentar por qué? –
¿podría escribir cuál es el código que utilizó para reemplazarlo? –
y dónde está tu código –