IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Lecture des couleurs d'une image Bitmap


Sujet :

MFC

  1. #1
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Points : 3 325
    Points
    3 325
    Par défaut Lecture des couleurs d'une image Bitmap
    Bonjour à tous,

    comme indiqué dans le titre je voudrais récupérer les différentes couleurs contenues dans une image Bitmap. (appli MFC)

    il y a beaucoup de façons de faire apparemment, et je sais pas trop quelle lib choisir.
    ma première question serait quelle est le moyen le plus simple de lire les pixels de l'image.

    j'ai déjà une méthode qui affiche un bmp mais je comprend pas pourquoi les pixels ne sont pas chargés dans l'objet bitmap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_hBmpNew = (HBITMAP) LoadImage( AfxGetInstanceHandle(), p_sPath, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
    GetObject( m_hBmpNew , sizeof(BITMAP), &m_bmInfo );
    m_bmInfo.bmBits est null et je vois pas pourquoi.

    j'aimerai bien savoir sur quel chemin partir pour ne pas perdre trop de temps.

    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Intuitivement, j'aurais fait quelque chose comme ça :
    1/création d'un DC mémoire
    2/Sélection du bitmap dans le DC mémoire
    3/GetPixel


    [P.S.] : je déplace vers MFC.

  3. #3
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Points : 3 325
    Points
    3 325
    Par défaut
    merci,
    j'ai donc réussis à lister les différentes couleurs d'un Bitmap.

    Le hic c'est que pour l'instant je charge un bmp qui est une ressource du projet.
    j'essaye d'adapter le code pour que ça fonctionne en chargeant un fichier externe. (en vain pour l'instant )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    vector <CString> CMaterialDialog::getColorList()
    {
        vector <CString> lstColor;
     
        CBitmap Bitmap;
        BITMAP InfosBmp;
        CClientDC dc(this);
        CDC MemDC;
     
        Bitmap.LoadBitmap(IDB_BITMAP_TEST); // lecture bitmap dans les ressources
        Bitmap.GetBitmap(&InfosBmp);
        if( MemDC.CreateCompatibleDC( &dc ) )// creation d'un DC en memoire
        {
            MemDC.SelectObject(&Bitmap); // selection du bitmap dans le DC en memoire
     
            COLORREF colorRef;
            CString sColor;
            POINT pt;
            bool bColorAlreadyPresent;
     
            for(long lX=0; lX<InfosBmp.bmWidth; lX++)
            {
                for(long lY=0; lY<InfosBmp.bmHeight; lY++)
                {
                    pt.x = lX;
                    pt.y = lY;
                    colorRef = MemDC.GetPixel( pt );
                    sColor.Format("%02X%02X%02X", GetRValue(colorRef), GetGValue(colorRef), GetBValue(colorRef) );
     
                    bColorAlreadyPresent = false;
                    for(unsigned int i=0; i<lstColor.size(); i++)
                    {
                        if( lstColor.at(i) == sColor )
                        {
                            bColorAlreadyPresent = true;
                            break;
                        }
                    }
                    if( !bColorAlreadyPresent )
                        lstColor.push_back( sColor );
                }
            }
        }
     
        return lstColor;
    }
    Merci à ceux qui se pencheront sur mon problème.

    et bon week-end à tous

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    Points : 63
    Points
    63
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
             if(FromRessources)
    	{
    		m_Bitmap = new(CBitmap);
    		m_Bitmap->LoadBitmap(IDB_BITMAP1);
    	}
    	else
    	{
    		HBITMAP hBmp = (HBITMAP) LoadImage(0, "Cabane.bmp",
                                            IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE);
    		if(hBmp)
    			m_Bitmap= CBitmap::FromHandle(hBmp);
     
    	}
    Et voila...

  5. #5
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Points : 3 325
    Points
    3 325
    Par défaut
    Merci

    je venais juste de mettre en place la même solution (à peu de choses près) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    vector <CString> CMaterialDialog::getColorList()
    {
        vector <CString> lstColor;
        vector <COLORREF> lstColorRef;
     
        BITMAP InfosBmp;
        CClientDC dc(this);
        CDC MemDC;
     
        HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), this->m_sBmpFilePath, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
     
        GetObject( hBitmap , sizeof(BITMAP), &InfosBmp );
     
        if( MemDC.CreateCompatibleDC( &dc ) ) // creation d'un DC en memoire
        {
            SelectObject(MemDC, hBitmap ); // selection du bitmap dans le DC en memoire
     
            COLORREF colorRef;
            CString sColor;
            POINT pt;
            bool bColorAlreadyPresent;
     
            for(long lX=0; lX<InfosBmp.bmWidth; lX++)
            {
                for(long lY=0; lY<InfosBmp.bmHeight; lY++)
                {
                    pt.x = lX;
                    pt.y = lY;
                    colorRef = MemDC.GetPixel( pt );
     
                    bColorAlreadyPresent = false;
                    for(unsigned int i=0; i<lstColorRef.size(); i++)
                    {
                        if( lstColorRef.at(i) == colorRef )
                        {
                            bColorAlreadyPresent = true;
                            break;
                        }
                    }
                    if( !bColorAlreadyPresent )
                        lstColorRef.push_back( colorRef );
                }
            }
            for(unsigned int i=0; i<lstColorRef.size(); i++)
            {
                sColor.Format("%02X%02X%02X", GetRValue(lstColorRef.at(i)), GetGValue(lstColorRef.at(i)), GetBValue(lstColorRef.at(i)) );
                lstColor.push_back( sColor );
            }
        }
     
        return lstColor;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection des couleurs d'une image
    Par flavdu44 dans le forum Images
    Réponses: 1
    Dernier message: 24/11/2011, 16h28
  2. Transformation des couleurs d'une image
    Par Seth77 dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 11/12/2009, 11h53
  3. [Débutant] Fleche, Texte, Cadre et Choix des couleurs sur une image
    Par niepoc dans le forum MATLAB
    Réponses: 10
    Dernier message: 16/07/2008, 16h44
  4. Réponses: 2
    Dernier message: 06/01/2007, 11h59
  5. [Traitement d'image] Modification des couleur d'une image png
    Par lio33 dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 01/10/2006, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo