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

C++ Discussion :

Recuperation de la couleur des pixels dans une image raw


Sujet :

C++

  1. #1
    Membre du Club Avatar de Seb2086
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 60
    Points : 44
    Points
    44
    Par défaut Recuperation de la couleur des pixels dans une image raw
    Bonjour,

    J'ai une image raw dans laquelle est dessiné un cube rouge, un cube vert et un cube bleu.
    L'image est enregistrée avec 3 couches et sans entrelacement.

    Je voudrais savoir comment recuperer la couleur de tout les pixels et les enregistrés dans un fichier txt.
    J'ai fait ce code mais ca n'a pas l'air de fonctionner.
    Merci pour vos réponses


    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
        ifstream ImageRAW ;
        BYTE* m_Donnee;
        DWORD TailleDonnees = LARGEUR * HAUTEUR * (64 / 8) ;;
        m_Donnee = new BYTE[TailleDonnees];
     
        ImageRAW.open("Heightmap.raw", ios::binary) ;
     
        ImageRAW.read((char*)m_Donnee, TailleDonnees) ;
        ImageRAW.close() ;
        COLORREF Couleur ;
        char ValeurHexa[32];
     
     
        ofstream CouleurPixels ;
        CouleurPixels.open("Couleur Des Pixels.txt") ;
        for(int x = 0 ; x < LARGEUR ; x++)
        {
            for (int y = 0 ; y < HAUTEUR ; y++)
            {
                Couleur = ((COLORREF*)m_Donnee)[LARGEUR * (HAUTEUR - 1 - y) + x] ;
                itoa(Couleur, ValeurHexa, 16);
                CouleurPixels << ValeurHexa << endl ;
            }
        }
        CouleurPixels.close() ;
    Donc je ne sais pas si ca vient du code ou alors si j'ai mal enregistré mon image raw.

    J'utilise ce code pour générer un terrain avec directX.
    Merci pour vos réponses.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    C'est quoi ce 64/8? Des images sur 64 bits j'ai encore jamais vu.
    Et puis c'est bien beau ton "ça ne fonctionne pas", t'aurais pas une observation plus constructive?

  3. #3
    Membre du Club Avatar de Seb2086
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 60
    Points : 44
    Points
    44
    Par défaut
    Oui désolé.
    En fait le 64 c'est la taille en pixel de mon image (64*64).

    En fait je pense que ca ne fonctionne pas car par exemple je charge une image raw avec du bleu et du rouge dedans (rouge en 255 et bleu en 255).
    Donc je m'attend à avoir dans mon fichier texte des valeurs du type 00ff0000 et 000000ff.
    Mais non j'ai des valeurs comme ff ou ff00ff.
    C'est pour ca que je dis que ca ne fonctionne pas.
    Mais je ne sais pas où est mon erreur.

    En fait j'aimerai recuperer les composantes rgb de chaque pixel.
    Merci pour ton aide.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Dans quel format exactement est stockée l'image. RGB ou BGR ? 24 ou 32 bits par pixel ? Les trois couches sont entrelacées ou les unes à la suite des autres ?

    Sinon pour le calcul de la taille la formule est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DWORD TailleDonnees = LARGEUR * HAUTEUR * (bitsParPixel / 8) ;

  5. #5
    Membre du Club Avatar de Seb2086
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 60
    Points : 44
    Points
    44
    Par défaut
    Le format c'est RGB.
    8 bits par pixels
    Et les couches ne sont pas entrelacées.

    Merci pour ta réponse

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Alors il faut lire les couches les unes après les autres.

    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
    int TailleDonnees = LARGEUR * HAUTEUR ;
    std::vector<unsigned char> CoucheR(TailleDonnees) ;
    std::vector<unsigned char> CoucheV(TailleDonnees) ;
    std::vector<unsigned char> CoucheB(TailleDonnees) ;
    ...
    ImageRAW.read((char*)&CoucheR[0], TailleDonnees) ;
    ImageRAW.read((char*)&CoucheV[0], TailleDonnees) ;
    ImageRAW.read((char*)&CoucheB[0], TailleDonnees) ;
    ...
    for(int i = 0 ; i < TailleDonnees ; i++)
    {
        unsigned long ValeurPixel = (CoucheR[i] << 16) + (CoucheV[i] << 8) + CoucheB[i] ;
        CouleurPixels << std::hex << ValeurPixel << '\n' ;
    }
    ...
    Notes les quelques améliorations par rapport à ton code :
    - Utilisation de std::vector pour gérer la mémoire (plus simple, pas besoin de delete).
    - Une seule boucle pour parcourir les pixels suffit ici.
    - Pas besoin de itoa pour afficher en hexa, il existe un manipulateur std::hex pour cela.
    - Remplacement de endl par '\n', car endl effectue un flush et ici cela risque de ralentir pas mal l'écriture.

  7. #7
    Membre du Club Avatar de Seb2086
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 60
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup c'est exactement ce qu'il me fallait.

    Par contre j'ai un probleme.
    Mon image est rouge en haut verte au milieu et bleue en bas
    Et dans mon fichier texte voila ce qu'il y 'a.
    Pour le rouge ff0000 donc ca c bon
    Par contre pour le vert j'ai ff00
    et pour le bleu j'ai ff donc il me manque les autres composantes c'est normal ?

    Edit : En fait c'est bon ca fait ca quand les composantes sont égales à 0.
    Sinon ca fonctionne parfaitement encore merci tu m'a rendu un grand service

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

Discussions similaires

  1. Interpoler les couleurs des pixels d'une image
    Par mina777 dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2009, 19h35
  2. Changer la couleur des pixels d'une image
    Par k_meleon dans le forum VBA Access
    Réponses: 0
    Dernier message: 31/03/2008, 16h22
  3. Modifier des pixels dans une image
    Par hitomigaia dans le forum wxWidgets
    Réponses: 2
    Dernier message: 15/11/2007, 18h16
  4. Réponses: 1
    Dernier message: 02/11/2006, 09h25
  5. Recuperer l'intensite d'un pixel dans une image
    Par Battosaiii dans le forum Langage
    Réponses: 6
    Dernier message: 03/07/2006, 04h44

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