Je voudrais, en code et à la demande, convertir un objet Image RGBA 32 bits (à l'origine un PNG 32 bits) en son équivalent en niveaux de gris 32 bits .Comment convertir l'image RGBA 32 bits en alpha dégradé
J'ai déjà read plusieurs questions other ici, ainsi que de nombreux articles en ligne. J'ai essayé d'utiliser ColorMatrix pour le faire, mais il ne semble pas très bien gérer l'alpha. Les pixels qui sont entièrement en niveaux de gris opaque parfaitement. Tout pixel qui est partiellement transparent ne semble pas bien se traduire car il y a encore des nuances de couleur dans ces pixels. Il suffit d'être perceptible.
Le ColorMatrix J'utilise est la suivante:
new System.Drawing.Imaging.ColorMatrix(new float[][]{
new float[] {0.299f, 0.299f, 0.299f, 0, 0},
new float[] {0.587f, 0.587f, 0.587f, 0, 0},
new float[] {0.114f, 0.114f, 0.114f, 0, 0},
new float[] { 0, 0, 0, 1, 0},
new float[] { 0, 0, 0, 0, 1}
});
Ceci est, comme je l'ai lu, une matrice pondérée NTSC assez standard. Je l'utilise ensuite, avec Graphics.DrawImage
, mais comme je l'ai dit, les pixels partiellement transparents sont toujours colorés. Je devrais signaler que c'est l'affichage de l'objet Image via un WinForms PictureBox
sur un fond blanc. Serait-ce juste la façon dont PictureBox dessine ses images et manipule les parties transparentes? Les couleurs d'arrière-plan ne l'affectent pas (la teinte de la couleur provient certainement de l'image originale), mais peut-être que PictureBox ne redessine pas correctement les pixels transparents?
J'ai vu certaines méthodes qui utilisent un FormatConvertedBitmap avec un OpacityMask. Je ne l'ai pas essayé, principalement parce que je préfèrerais vraiment ne pas avoir à importer PresentationCore.dll (pour ne pas mentionner que cela ne fonctionnera pas dans les applications limitées .NET 2.0). Sûrement le matériel de base System.Drawing. * Peut faire cette procédure simple? Ou pas?
Etes-vous sûr que la couleur n'est pas due à ce qui se cache derrière l'image? Tant que les valeurs RVB sont exactement égales, il ne devrait y avoir aucune nuance. Postez votre définition ColorMatrix. – ChrisF
Je suis sûr que ce n'est pas le cas. L'image est présentée via un PictureBox. L'arrière-plan de PictureBox est, bien sûr, transparent, ce qui signifie simplement qu'il utilise la couleur de ses parents, qui est, dans ce cas, blanche. Les bords transparents de la nouvelle image en niveaux de gris sont cependant encore verts (l'image originale était principalement de couleur verte). –