Qual è il modo in C# per sostituire un colore per alcune parti di un'immagine senza influire sulla sua trama?sostituire il colore in un'immagine in C#
Si può vedere un buon esempio del risultato here
Grazie
Qual è il modo in C# per sostituire un colore per alcune parti di un'immagine senza influire sulla sua trama?sostituire il colore in un'immagine in C#
Si può vedere un buon esempio del risultato here
Grazie
trovato il modo di farlo, questo richiede RGB < - conversioni> HSL (buona classe per il colore HSL può essere trovato here)
1. Ottenere un valore di riferimento (in HSL) che rappresentano il colore che si desidera sostituire
2. Ottenere il valore HSL per il vostro colore di destinazione
3. pixel dell'immagine Get e per ogni pixel:
4. calcolare il valore HSL del pixel, e sostituirlo con (pixelHsl/refHsl) * targetHsl
Questo ha fatto il lavoro per me, grazie per tutti coloro che hanno aiutato
provare questo:
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' è molto lento, si veda: http://stackoverflow.com/questions/4235731/is-there-a-faster-alternative-to-gdi-getpixel –
sì non molto veloce, ma per il colore delle immagini di piccole dimensioni è molto efficace. –
L'unico problema con il cambiamento dei colori di un'immagine è quello non selettivo. Ad esempio, in un'immagine che vuoi cambiare da nero a rosso in una determinata porzione non è possibile. per esempio se nell'immagine di una persona vuoi cambiare i colori dei capelli in rosso, allora non è possibile. sostituirà tutti i pixel neri con il rosso, indipendentemente da dove appaiono nell'immagine. –
Provate a leggere al pixel e li roba in un 3 di array (RGB) ci si può ambientato in un alogritmo per sostituire i tuoi colori.
Ciao, grazie - tuttavia questo non è rilevante per quello che mi serve. Quello di cui ho realmente bisogno è di applicare un colore a una sostituzione in un modo che manterrà la trama – Oren
che è somme lo stesso, la trama è solo una variazione di colori. come il cielo blu e una nuvola bianca può essere un cielo viola e una nuvola viola un po 'più scura o una sommatoria come quella. – jorne
Un modo per sostituire in modo efficiente un colore è utilizzare una tabella di rimappatura. Nell'esempio seguente, un'immagine viene disegnata all'interno di una finestra immagine. Nel caso in Paint, il Color.Black colore viene modificato in 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);
}
}
Maggiori informazioni: http://msdn.microsoft.com/en-us/library/4b4dc1kz%28v=vs.110%29.aspx
Sul fare ricerca ho trovato nessun efficiente/smoothe modo di fare questo, così io non lo me stesso, il codice potrebbe essere ripulito da molto, ma ha fatto il lavoro, non è efficiente ma è più fluido e consente di impostare una tolleranza.
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ì, funziona come un fascino. Potresti commentare perché? –
potresti scrivere quale codice hai usato per sostituirlo? –
e dov'è il tuo codice –