2010-08-01 5 views
6

Je travaille avec Bitmap C# et je me demande comment convertir une image png couleur à une seule couleur. Je veux que toutes les couleurs visibles dans l'image deviennent blanches. Les parties qui sont transparentes doivent rester transparentes. Je vais montrer ces agains sur un fond gris.Convertir PNG transparent en couleur à une seule couleur

+0

double possible de [GDI +: Définir tous les pixels de couleur donnée tout en conservant la valeur alpha existante] (http://stackoverflow.com/questions/2510013/gdi-set-all- pixel-to-given-color-while-retaining-existing-alpha-value) –

+0

Y a-t-il quelque chose que je pourrais ajouter à ma réponse, puisque vous n'avez accepté aucune réponse? – Cloudanger

+0

Salut et désolé pour la réponse tardive. J'ai essayé le code maintenant et je ne peux pas le faire fonctionner. Tous mes pixels deviennent blancs et cela ne laisse pas les pixels transparents des png intacts. – jesperlind

Répondre

7

Les autres réponses ont été utiles et m'ont permis de partir, merci beaucoup. Je ne pouvais pas les faire travailler, je ne sais pas pourquoi. Mais j'ai également découvert que je voulais conserver la valeur alpha originale des pixels, rendant les bords lisses. C'est ce que j'ai trouvé.

for (int x = 0; x < bitmap.Width; x++) 
{ 
    for (int y = 0; y < bitmap.Height; y++) 
    { 
     Color bitColor = bitmap.GetPixel(x, y); 
     //Sets all the pixels to white but with the original alpha value 
     bitmap.SetPixel(x, y, Color.FromArgb(bitColor.A, 255, 255, 255)); 
    } 
} 

Voici une copie d'écran du résultat magnifié quelques fois (d'origine sur le dessus): alt text http://codeodyssey.se/upload/white-transparent.png

+0

Fonctionne très bien merci! – CareTaker22

1

essayer le code suivant:

void Test() 
    { 
     Bitmap bmp = new Bitmap(50, 50);//you will load it from file or resource 

     Color c = Color.Green;//transparent color 

     //loop height and width. 
     // YOU MAY HAVE TO CONVERT IT TO Height X VerticalResolution and 
     // Width X HorizontalResolution 
     for (int i = 0; i < bmp.Height; i++) 
     { 
      for (int j = 0; j < bmp.Width; j++) 
      { 
       var p = bmp.GetPixel(j, i);//get pixle at point 

       //if pixle color not equals transparent 
       if(!c.Equals(Color.FromArgb(p.ToArgb()))) 
       { 
        //set it to white 
        bmp.SetPixel(j,i,Color.White); 
       } 
      } 
     } 
    } 

PS: ce n'est pas testé et en aucune façon optimisée

7

Si l'image ne pas utiliser le canal alpha pour la transparence alors ce qui suit fera:

Bitmap image; 

for (int x = 0; x < image.Width; x++) 
{ 
    for (int y = 0; y < image.Height; y++) 
    { 
     if (image.GetPixel(x, y) != Color.Transparent) 
     { 
      image.SetPixel(x, y, Color.White); 
     } 
    } 
} 
4

SetPixel est à peu près la façon la plus lente possible de le faire. Vous pouvez utiliser un ColorMatrix à la place:

var newImage = new Bitmap(original.Width, original.Height, 
          original.PixelFormat); 

using (var g = Graphics.FromImage(newImage)) { 
    var matrix = new ColorMatrix(new[] { 
     new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }, 
     new float[] { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f } 
    }); 

    var attributes = new ImageAttributes(); 

    attributes.SetColorMatrix(matrix); 

    g.DrawImage(original, 
       new Rectangle(0, 0, original.Width, original.Height), 
       0, 0, original.Width, original.Height, 
       GraphicsUnit.Pixel, attributes); 
} 
+0

Certainement plus élégant, avec l'avantage supplémentaire d'exiger que l'on apprenne un nouvel espace colorimétrique, un nouveau concept de manipulation des couleurs, et d'utiliser ces nouvelles connaissances pour comprendre ce que vous venez de faire. :) J'aime ça! –

+0

PS: Votre syntaxe C# est correcte, tant que 'using System.Drawing;' et 'using System.Drawing.Imaging;' sont en place. –

Questions connexes