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 :

recupere une partie d'un nombre hexadecimal


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut recupere une partie d'un nombre hexadecimal
    Bonjour,
    J'ai un nombre en hexadecimal representant une couleur sous la forme RGBA
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int = 0xAABBCCFF;
    comment puis-je recuperer chaque composante ?
    il va sens dire que pour des raison de performance, je ne passerai pas par une conversion en chaine de caractere...

  2. #2
    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
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      unsigned int color = 0xAABBCCFF;
      unsigned char R,G,B,A;
      A = color;       // A = 0xFF
      B = color >>= 8; // B = 0xCC
      G = color >>= 8; // G = 0xBB
      R = color >>= 8; // R = 0xAA

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonsoir,

    Sauf erreur de ma part, il manque au moins un « ( expr ) && 0xFF » à chaque ligne…

  4. #4
    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
    Non, pas si on a défini R,G,B,A en unsigned char comme dans l'exemple.
    Si ils étaient en unsigned int, il faudrait effectivement un masque

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Joa,

    Misère du copier/coller.

    Par contre, il ne faut pas utiliser le même décalage pour toutes les valeurs.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Comme "unsigned int" peut faire moins de 4 octets, il est préférable d'utiliser le type "unsigned long". Sinon ce n'est pas portable.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par diogene Voir le message
    Non, pas si on a défini R,G,B,A en unsigned char comme dans l'exemple.
    Effectivement, j'ai posté trop vite ! :-)

  8. #8
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Bonjour,
    Vous pouvez le faire sans aucun calcul à l'exécution, même si le code source est un peu plus compliqué à manier. Première version:
    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>
    #include <stdlib.h>
    #include <stdint.h>
    #include <inttypes.h>
     
    int main(void) {
    	uint32_t color = 0xA1B2C3F4;
    	uint8_t* A     = (uint8_t*)&color;
    	uint8_t* B     = A + 1;
    	uint8_t* G     = A + 2;
    	uint8_t* R     = A + 3;
    	printf("%02"PRIX8" %02"PRIX8" %02"PRIX8" %02"PRIX8"\n", *R, *G, *B, *A);
    	return EXIT_SUCCESS;
    }
    Deuxième version:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <inttypes.h>
     
    enum { alpha, blue, green, red};
     
    int main(void) {
    	uint32_t color = 0xA1B2C3F4;
    	uint8_t* colors = (uint8_t*)&color;
    	printf("%02"PRIX8" %02"PRIX8" %02"PRIX8" %02"PRIX8"\n", colors[red], colors[green], colors[blue], colors[alpha]);
    	return EXIT_SUCCESS;
    }
    Ce n'est pas portable à cause du boutisme. Là, ça marche pour des machine petit-boutiennes. Il suffit de prévoir les deux possibilités (dans la seconde version, il suffit d'inverser l'enum). Pour les machines gros-boutiennes, il faut inverser.
    Si vous avez des exigences de performance sur de grosses images, et qu'il n'est pas nécessaire de dupliquer la donnée, c'est certainement une approche intéressante.

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

Discussions similaires

  1. [PostGreSql] récupérer une partie d'un enregistrement
    Par Mat_DZ dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/08/2006, 10h38
  2. [Tableaux] recupere une partie de l'adresse IP
    Par 18Marie dans le forum Langage
    Réponses: 1
    Dernier message: 21/06/2006, 01h03
  3. Réponses: 2
    Dernier message: 11/05/2006, 15h12
  4. [Tableau] récupérer une partie d'un tableau
    Par keyra dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 07/02/2006, 22h17
  5. Picklist: comment recuperer une partie de la valeur
    Par mesquest dans le forum Bases de données
    Réponses: 3
    Dernier message: 07/06/2004, 08h54

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