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
Répondre
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
Fonctionne très bien merci! – CareTaker22
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
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);
}
}
}
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);
}
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! –
PS: Votre syntaxe C# est correcte, tant que 'using System.Drawing;' et 'using System.Drawing.Imaging;' sont en place. –
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) –
Y a-t-il quelque chose que je pourrais ajouter à ma réponse, puisque vous n'avez accepté aucune réponse? – Cloudanger
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