2010-03-24 14 views
6

Was ist die beste Möglichkeit, um die RGB-Komponenten jedes Pixels in einer System.Drawing.Bitmap zu einer einzigen, durchgehenden Farbe zu setzen? Wenn möglich, möchte ich vermeiden, manuell jedes Pixel zu durchlaufen, um dies zu tun.GDI +: Setzen Sie alle Pixel auf eine bestimmte Farbe und behalten Sie dabei den vorhandenen Alpha-Wert bei

Hinweis: Ich möchte die gleiche Alpha-Komponente von der ursprünglichen Bitmap beibehalten. Ich möchte nur die RGB-Werte ändern.

Ich schaute in mit einem ColorMatrix oder ColorMap, aber ich konnte keine Möglichkeit finden, alle Pixel auf eine bestimmte gegebene Farbe mit beiden Ansatz zu setzen.

Antwort

13

Ja, verwenden Sie eine ColorMatrix. Es sollte wie folgt aussehen:

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 

Wo R, G und B sind die skalierten Farbwerte der Ersatzfarbe (Division durch 255.0f)

+0

Dies legt die Farbe jedes Pixels nicht auf eine bestimmte Farbe fest, oder? Ich bin mir ziemlich sicher, dass jeder Farbkanal um R, G und B erhöht würde. Ich möchte, dass das ganze Bild eine Volltonfarbe ist, während nur die Transparenz/Alpha jedes Pixels beibehalten wird. – Charles

+1

Die Nullen in der Diagonale erzeugen Schwarz, die unteren Zahlen werden hinzugefügt. –

+0

Ah-ha. Ich habe nicht alles durchdacht. Ich wette, das sollte perfekt funktionieren. Ich überprüfe und bin gleich wieder bei dir. – Charles

2

Die beste Option (zumindest in Bezug auf die Leistung) besteht darin, Bitmap.LockBits zu verwenden und die Pixeldaten in der Scanzeile durchzuschleifen und die RGB-Werte einzustellen.

Da Sie die Alpha nicht ändern möchten, müssen Sie jedes Pixel durchlaufen - es gibt keine einzige Speicherzuweisung, die Alpha erhält und RGB ersetzt, da sie ineinander verschachtelt sind.

+0

+1. Danke Reed, ich werde das wahrscheinlich für ein paar andere Sachen, die ich mache, verwenden. – Charles

6

Ich weiß, das bereits beantwortet, aber basierend auf Hans passant Antwort der resultierende Code etwa wie folgt aussieht:

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

eine Arbeits Demo hier herunterladen: http://benpowell.org/change-the-color-of-a-transparent-png-image-icon-on-the-fly-using-asp-net-mvc/

Verwandte Themen