Convertir une image de Format32bppPArgb en Format24bppRgb

cs_AMSOLL Messages postés 8 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 13 mars 2011 - 6 janv. 2010 à 20:08
cs_AMSOLL Messages postés 8 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 13 mars 2011 - 8 janv. 2010 à 11:45
slt tous;
j'ai besoin de convertir une image bitmap en Format24bppRgb pour prendre la valeur de niveau de gris de chaque pixels de cette image;
comment je peut faire ça?
merci d'avance

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 janv. 2010 à 02:00
Salut, je n'ai pas testé de 32PARGB à 24RGB, je ne sais pas si la conversion de format est correct :

Bitmap copy = new Bitmap( original.Width, original.Height, PixelFormat.Format24bppRgb );
using ( Graphics g = Graphics.FromImage( copy ) )
{
g.DrawImage( original, 0, 0, copy.Width, copy.Height );
}
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
7 janv. 2010 à 10:35
Salut

J'ai du mal à comprendre pourquoi tu as besoin de convertir ton image en 24 bits si tu cherches juste à avoir la valeur de chaque pixel en niveau de gris.

Si tu cherches à avoir ton image en noir et blanc, le plus simple et le plus rapide est d'utiliser une matrice que tu appliques sur ton image (je n'ai pas le code en tête, mais 2 min de recherche sur internet devraient suffire)

Si tu cherches juste à calculer la valeur d'un pixel en niveau de gris, utilise la méthode GetPixel() (qui marche aussi bien sur du 32 que du 24 bits.

// Proportions de couleur pour du VRAI noir et blanc (pas tout à fait sûr des valeurs)
float propR = 0.3;
float propG = 0.6;
float propB = 0.1;

Color c = MaBitmap.GetPixel(x, y);
int valeur = (int)(c.R * propR + c.G * propG + c.B * propB);


Si tu as besoin de calculer la valeur en niveau de gris pour tous les pixels, il vaut mieux utiliser du code unsafe, plus performant..
Imaginons que tu veuilles compter le nombre de pixel de chaque "couleur" si tu passe ton image en niveaux de gris :

float propR = 0.3;
float propG = 0.6;
float propB = 0.1;

int[] tableau = new int[256];
for (int i 0; i < 256; i++) tableau[i] 0; // Normalement pas nécessaire

unsafe
{
    BitmapData MaBmpData = MaBitmap.LockBits(new Rectangle(0, 0, MaBitmap.Width, MaBitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

    byte* pixelActuel = (byte*)(void*)MaBmpData.Scan0;
    for (int y = 0; y < MaBitmap.Height; y++)
    {
        for (int x = 0; x < MaBitmap.Width; x++)
        {
            int valeur = (int)(pixelActuel[1] * propR + pixelActuel[2] * propG + pixelActuel[3] * propB);
            // Il faut peut-être remplacer les indices par 0 1 2
            // (je ne sais plus si le pixel alpha est avant ou après les pixels de couleur)

            tableau[valeur]++;

            // On n'oublie pas de déplacer le pointeur de lecture
            pixelActuel += 4; // Ou 3 en 24 bits
        }
    }
    MaBitmap.UnlockBits(MaBmpData);
}


Avec ça, le programme ne perdra pas de temps à faire du LockBits et UnlockBits pour chaque pixel (comme il le fait pour GetPixel())

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 janv. 2010 à 11:25
Krimog > si le titre du sujet est correct il parle du format Format32bppPArgb ( premultiplied alpha ) et dans ce cas les valeurs RGB doivent être differentes du format Format32bppRgb.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
7 janv. 2010 à 12:04
Au temps pour moi, je n'avais pas vu

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AMSOLL Messages postés 8 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 13 mars 2011
7 janv. 2010 à 18:10
salut
merci tous pour votre idées;
et krimog; tu m'a donné la formule qui je peut l'utiliser pour convertir une image en niveau de gris; est ce que te connait la formule pour faire l'inverse(pour convertir une image en niveaux de gris vers une image en rvb)
merci d'avance;
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
8 janv. 2010 à 10:28
@AMSOLL :
Théoriquement, ce n'est pas possible. Tout simplement parce que tu perds des informations. Tu avais, à la base, 3 octets de couleurs, et tu te retrouves avec 1 octet.
C'est mathématiques : tu as
g = 0.3r + 0.6v + 0.1b
C'est la seule équation que tu aies. Or il faut 1 équation par inconnue. En connaissant g, il te reste 3 inconnues (r, v et b) => impossible.

Si, par exemple, tu connais la composante rouge et la composante bleue, tu peux trouver la composante verte (car tu as 1 inconnue et 1 équation).
Si tu connais la composante rouge et la luminosité, tu dois pouvoir trouver les 2 autres composantes (car 2 inconnues (vert et bleu) et 2 équations (celle ci-dessus et celle pour calculer la luminosité en fonction des composantes r, v et b))


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
cs_AMSOLL Messages postés 8 Date d'inscription lundi 21 décembre 2009 Statut Membre Dernière intervention 13 mars 2011
8 janv. 2010 à 11:45
ok
merci beaucoup krimog
0
Rejoignez-nous