2012-03-26 9 views

risposta

2

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

+0

Sì, funziona come un fascino. Potresti commentare perché? –

+1

potresti scrivere quale codice hai usato per sostituirlo? –

+0

e dov'è il tuo codice –

3

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); 
    } 
} 
+0

'GetPixel' è molto lento, si veda: http://stackoverflow.com/questions/4235731/is-there-a-faster-alternative-to-gdi-getpixel –

+0

sì non molto veloce, ma per il colore delle immagini di piccole dimensioni è molto efficace. –

+0

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. –

2

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.

+0

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

+0

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

8

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

0

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; 
    }