2010-03-24 4 views
6

Quelle est la meilleure façon de définir les composants RVB de chaque pixel d'un System.Drawing.Bitmap sur une seule couleur unie? Si possible, j'aimerais éviter de boucler manuellement chaque pixel pour le faire.GDI +: Règle tous les pixels sur une couleur donnée tout en conservant la valeur alpha existante

Remarque: Je souhaite conserver le même composant alpha de l'image bitmap d'origine. Je veux seulement changer les valeurs RVB.

J'ai examiné en utilisant un ColorMatrix ou ColorMap, mais je ne pouvais pas trouver un moyen de régler tous les pixels à une couleur donnée spécifique avec l'une ou l'autre approche.

Répondre

13

Oui, utilisez un ColorMatrix. Il devrait ressembler à ceci:

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 

Où R, G et B sont les valeurs de couleur mis à l'échelle de la couleur de remplacement (division par 255.0f)

+0

Cela ne définit pas la couleur de chaque pixel à une couleur spécifique, n'est-ce pas? Je suis sûr que cela augmenterait chaque canal de couleur par R, G et B. Je veux que l'image entière soit une couleur solide, tout en conservant juste la transparence/alpha de chaque pixel. – Charles

+1

Les zéros de la diagonale produisent du noir, les chiffres du bas sont ajoutés. –

+0

Ah-ha. Je ne pensais pas à tout ça. Je parie que cela devrait fonctionner parfaitement. Je vais vérifier et être de retour avec vous. – Charles

2

La meilleure option (en termes de perf, au moins) est d'utiliser Bitmap.LockBits et de faire défiler les données de pixel dans la ligne de balayage, en définissant les valeurs RVB. Puisque vous ne voulez pas changer l'Alpha, vous devrez parcourir chaque pixel - il n'y a pas d'assignation de mémoire unique qui préservera l'alpha et remplacera RGB, puisqu'ils sont entrelacés ensemble.

+0

+1. Merci Reed, je vais probablement utiliser ça pour d'autres choses que je fais. – Charles

6

Je sais que cela a déjà répondu, mais d'après Hans pASSANT Répondons le code résultant ressemble à ceci:

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

Téléchargez une démo de travail ici: http://benpowell.org/change-the-color-of-a-transparent-png-image-icon-on-the-fly-using-asp-net-mvc/

Questions connexes