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 :

manipulations bit à bit


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut manipulations bit à bit
    bonjour

    je recupère la valeur du pixel d'une image dans un entier. Le pixel est codé en RGB. Cela signifie que mon entier contient 4 informations stockées chacune sur un octet : la valeur pour le rouge, pour le vert, pour le bleu et pour l'alpha.
    je souhaite récupérer chacune de ces informations séparément dans un entier.

    Pour celà j'ai écrit 3 fonctions opérant chacune un décalage et appliquant un masque pour obtenir les valeurs pour les composantes red, green et blue.

    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 
    redFromRGB(int *rgb){
       return ((*rgb >> 16) & 0xff);
    }
     
    int 
    greenFromRGB(int *rgb){
      return ((*rgb >> 8) & 0xff);
    }
     
    int 
    blueFromRGB(int *rgb){
         return((*rgb) & 0xff);
    }
    Problème : je récupère toujours 0 pour les composants red et green.
    Où est mon erreur ?

    merci pour votre aide

  2. #2
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,
    Citation Envoyé par floopi51 Voir le message
    Problème : je récupère toujours 0 pour les composants red et green.
    Où est mon erreur ?

    merci pour votre aide
    Peut-être un problème d'endianess? essaie avec quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int blueFromRGB(int *rgb);
    int blueFromRGB(int *rgb)
    {
        int tempval = *rgb;
         return (tempval & 0xff);
    }
     
    int main()
    {
        int mycolor = 0x123456;
        printf ("blue : %02x",blueFromRGB(&mycolor )) ;
        return 0;}
    A+

    Pfeuh

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ca marche pour moi. Comment et avec quelle valeur appelles-tu tes fonctions ?

  4. #4
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    voici l'extrait de code ou j'appelle mes fonctions :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      int* c_pix;
     ....
          red = redFromRGB(c_pix);
          green = greenFromRGB(c_pix);
          blue = blueFromRGB(c_pix);
     
          fprintf(stderr,"*c_pix=<%d>\n",*c_pix);
          fprintf(stderr,"red=<%d>\n",pix->red);
          fprintf(stderr,"green=<%d>\n",pix->green);
          fprintf(stderr,"blue=<%d>\n",pix->blue);
    si j'ai *c_pix = 127.
    je recupère :
    red = 0
    green = 0
    blue = 127

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    voici l'extrait de code ou j'appelle mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      int* c_pix;
     ....
          red = redFromRGB(c_pix);
          green = greenFromRGB(c_pix);
          blue = blueFromRGB(c_pix);
     
          fprintf(stderr,"*c_pix=<%d>\n",*c_pix);
          fprintf(stderr,"red=<%d>\n",pix->red);
          fprintf(stderr,"green=<%d>\n",pix->green);
          fprintf(stderr,"blue=<%d>\n",pix->blue);
    si j'ai *c_pix = 127.
    je recupère :
    red = 0
    green = 0
    blue = 127
    Si tu passes des pointeurs non initialisés, il se passe n'importe quoi. Le comportement est indéfini.

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    si j'ai *c_pix = 127.
    je recupère :
    red = 0
    green = 0
    blue = 127
    Où est le problème ?

  7. #7
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut

    effectivement vu comme ça il n'y a pas de problème.
    mais sachant que je recupère les données dans une image qui n'est pas toute bleue, j'ai un problème......

    celà doit venir de ma façon de lire les données....
    en tout cas merci pour vos réponses.
    je continue de chercher........

  8. #8
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    en relisant mon code je viens de voir que je ne lisais qu'un octet dans mon fichier au lieu de 4...... donc je ne pouvais pas avoir 4 informations dans mon entier

    merci.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    bonjour

    je recupère la valeur du pixel d'une image dans un entier. Le pixel est codé en RGB. Cela signifie que mon entier contient 4 informations stockées chacune sur un octet : la valeur pour le rouge, pour le vert, pour le bleu et pour l'alpha.
    je souhaite récupérer chacune de ces informations séparément dans un entier.
    Problème : je récupère toujours 0 pour les composants red et green.
    Où est mon erreur ?
    Je ne vois pas trop de problèmes avec ce code, à part que tout devrait se faire en unsigned...

    Ceci :
    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
     
    #include <stdio.h>
     
    int redFromRGB (int *rgb)
    {
       return ((*rgb >> 16) & 0xff);
    }
     
    int greenFromRGB (int *rgb)
    {
       return ((*rgb >> 8) & 0xff);
    }
     
    int blueFromRGB (int *rgb)
    {
       return ((*rgb) & 0xff);
    }
     
    int main (void)
    {
       unsigned long rgb = 1;
     
       while (rgb != 0)
       {
          printf ("R=%d ", redFromRGB ((int *) &rgb));
          printf ("G=%d ", greenFromRGB ((int *) &rgb));
          printf ("B=%d\n", blueFromRGB ((int *) &rgb));
          rgb <<= 1lu;
       }
     
       return 0;
    }
    donne
    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
     
    R=0 G=0 B=1
    R=0 G=0 B=2
    R=0 G=0 B=4
    R=0 G=0 B=8
    R=0 G=0 B=16
    R=0 G=0 B=32
    R=0 G=0 B=64
    R=0 G=0 B=128
    R=0 G=1 B=0
    R=0 G=2 B=0
    R=0 G=4 B=0
    R=0 G=8 B=0
    R=0 G=16 B=0
    R=0 G=32 B=0
    R=0 G=64 B=0
    R=0 G=128 B=0
    R=1 G=0 B=0
    R=2 G=0 B=0
    R=4 G=0 B=0
    R=8 G=0 B=0
    R=16 G=0 B=0
    R=32 G=0 B=0
    R=64 G=0 B=0
    R=128 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
    R=0 G=0 B=0
     
    Process returned 0 (0x0)   execution time : 0.035 s
    Press any key to continue.
    ce qui me parait normal.

    Et je suggère de ne faire qu'une fonction qui charge une structure rgb...
    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
     
    #include <stdio.h>
     
    struct rgb
    {
       unsigned r;
       unsigned g;
       unsigned b;
    };
     
    void getFromRGB (struct rgb *p_rgb, unsigned long i_rgb)
    {
       p_rgb->r = (i_rgb >> (8*2)) & 0xFF;
       p_rgb->g = (i_rgb >> (8*1)) & 0xFF;
       p_rgb->b = (i_rgb >> (8*0)) & 0xFF;
    }
     
    int main (void)
    {
       unsigned long i_rgb = 1;
     
       while (i_rgb != 0)
       {
          struct rgb rgb;
     
          getFromRGB (&rgb, i_rgb);
     
          printf ("R=%d ", rgb.r);
          printf ("G=%d ", rgb.g);
          printf ("B=%d\n",rgb.b);
          i_rgb <<= 1lu;
       }
     
       return 0;
    }

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

Discussions similaires

  1. manipulation de bits d'un byte
    Par orelero dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2008, 10h41
  2. word_t et Manipulation de bits
    Par fmichael dans le forum C#
    Réponses: 2
    Dernier message: 19/03/2007, 09h33
  3. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    Réponses: 5
    Dernier message: 05/02/2007, 09h51
  4. [Ada] Manipulation de "Bits"
    Par BoBy9 dans le forum Ada
    Réponses: 2
    Dernier message: 14/06/2006, 11h57
  5. Manipulation de bits
    Par Tsly dans le forum C++
    Réponses: 2
    Dernier message: 28/09/2005, 12h41

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