Convertir une image de Format32bppPArgb en Format24bppRgb

Signaler
Messages postés
8
Date d'inscription
lundi 21 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2011
-
Messages postés
8
Date d'inscription
lundi 21 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2011
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
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 );
}
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
48
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é. -
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
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.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
48
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é. -
Messages postés
8
Date d'inscription
lundi 21 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2011

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;
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
48
@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é. -
Messages postés
8
Date d'inscription
lundi 21 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2011

ok
merci beaucoup krimog