2010-03-24 8 views
6

¿Cuál es la mejor manera de establecer los componentes RGB de cada píxel en System.Drawing.Bitmap en un solo color sólido? Si es posible, me gustaría evitar el bucle manual a través de cada píxel para hacer esto.GDI +: establece todos los píxeles al color dado conservando el valor alfa existente

Nota: Quiero mantener el mismo componente alfa del mapa de bits original. Solo quiero cambiar los valores RGB.

Analicé el uso de ColorMatrix o ColorMap, pero no pude encontrar ninguna manera de establecer todos los píxeles a un color específico dado con cualquiera de los enfoques.

Respuesta

13

Sí, use una ColorMatrix. Se debe tener este aspecto:

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 

Donde R, G y B son los valores de color a escala de la color de sustitución (dividir por 255.0f)

+0

Esto no establece el color de cada píxel a un color específico, ¿o sí? Estoy bastante seguro de que se incrementará cada canal de color por R, G y B. Quiero que la imagen completa sea de un color sólido, conservando solo la transparencia/alfa de cada píxel. – Charles

+1

Los ceros en la diagonal producen negro, los números de abajo se agregan. –

+0

Ah-ha. No estaba pensando todo el tiempo. Apuesto a que debería funcionar perfectamente. Lo verificaré y estaré de regreso contigo. – Charles

2

La mejor opción (en términos de perf, al menos) es usar Bitmap.LockBits, y recorrer los datos de píxel en la línea de escaneo, estableciendo los valores RGB.

Dado que no desea cambiar el alfa, tendrá que recorrer cada píxel: no hay una sola asignación de memoria que preserve alfa y reemplace RGB, ya que están intercaladas.

+0

1. Gracias Reed, probablemente lo use para otras cosas que estoy haciendo. – Charles

6

Sé que esto ya está contestada, pero en base a Hans passant a responder el código resultante es como la siguiente:

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

descargar una demo de trabajo aquí: http://benpowell.org/change-the-color-of-a-transparent-png-image-icon-on-the-fly-using-asp-net-mvc/

Cuestiones relacionadas