2010-03-24 14 views
6

Qual è il modo migliore per impostare i componenti RGB di ogni pixel in un System.Drawing.Bitmap in un unico colore solido? Se possibile, vorrei evitare di eseguire manualmente il looping di ciascun pixel per farlo.GDI +: imposta tutti i pixel su un determinato colore mantenendo il valore alfa esistente

Nota: Voglio mantenere lo stesso componente alfa dalla bitmap originale. Voglio solo cambiare i valori RGB.

Ho esaminato l'utilizzo di ColorMatrix o ColorMap, ma non sono riuscito a trovare alcun modo per impostare tutti i pixel su un determinato colore specifico con entrambi gli approcci.

risposta

13

Sì, utilizzare ColorMatrix. Dovrebbe assomigliare a questo:

0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 1 0 
    R G B 0 1 

Dove R, G e B sono i valori dei colori in scala del colore di sostituzione (dividere per 255.0f)

+0

Questo non imposta il colore di ogni pixel su un colore specifico, vero? Sono abbastanza sicuro che aumenterebbe ogni canale di colore di R, G e B. Voglio che l'intera immagine sia di un colore solido, pur mantenendo solo la trasparenza/alfa di ciascun pixel. – Charles

+1

Gli zeri nella diagonale producono il nero, i numeri in basso vengono aggiunti. –

+0

Ah-ha. Non stavo pensando tutto Scommetto che dovrebbe funzionare perfettamente. Controllerò e torno subito con te. – Charles

2

L'opzione migliore (in termini di perf, almeno) è quella di utilizzare Bitmap.LockBits e scorrere i dati dei pixel nella riga di scansione, impostando i valori RGB.

Dato che non si desidera modificare l'Alpha, è necessario eseguire il ciclo di ogni pixel: non esiste una singola assegnazione di memoria che conserverà alfa e sostituirà RGB, poiché sono interlacciati insieme.

+0

+1. Grazie Reed, probabilmente lo userò per alcune altre cose che sto facendo. – Charles

6

So che questo è già una risposta, ma sulla base di Hans passant di rispondere il codice risultante simile a questa:

public class Recolor 
{ 
    public static Bitmap Tint(string filePath, Color c) 
    { 
     // load from file 
     Image original = Image.FromFile(filePath); 
     original = new Bitmap(original); 

     //get a graphics object from the new image 
     Graphics g = Graphics.FromImage(original); 

     //create the ColorMatrix 
     ColorMatrix colorMatrix = new ColorMatrix(
      new float[][]{ 
        new float[] {0, 0, 0, 0, 0}, 
        new float[] {0, 0, 0, 0, 0}, 
        new float[] {0, 0, 0, 0, 0}, 
        new float[] {0, 0, 0, 1, 0}, 
        new float[] {c.R/255.0f, 
           c.G/255.0f, 
           c.B/255.0f, 
           0, 1} 
       }); 

     //create some image attributes 
     ImageAttributes attributes = new ImageAttributes(); 

     //set the color matrix attribute 
     attributes.SetColorMatrix(colorMatrix); 

     //draw the original image on the new image 
     //using the color matrix 
     g.DrawImage(original, 
      new Rectangle(0, 0, original.Width, original.Height), 
      0, 0, original.Width, original.Height, 
      GraphicsUnit.Pixel, attributes); 

     //dispose the Graphics object 
     g.Dispose(); 

     //return a bitmap 
     return (Bitmap)original; 
    } 
} 

scaricare una demo di lavoro qui: http://benpowell.org/change-the-color-of-a-transparent-png-image-icon-on-the-fly-using-asp-net-mvc/

Problemi correlati