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 :

Décomposition Couleur 8bit en RGB


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 95
    Par défaut Décomposition Couleur 8bit en RGB
    Bonjour, (Je pense que c'est le bon endroit où poster le topic...)

    Je voudrais adapter un programme type "ancienne génération" fonctionnant apparement sous dos avec l'ancien mode de couleur 8 bits (256 couleurs) sur mon environnement graphique fonctionnant en mode RGB 24bits (1 octet par couleur donc).

    Ce que je ne comprend pas c'est comment fonctionne la lecture des couleurs.

    Voici une partie du code (je ne met pas tout pour ne pas surcharger l'ensemble)
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <graph.h>
    #include <limits.h>
     
    unsigned char *screen;
     
    /****************************************************************************/
    /* ClearBuffer() : vide le contenu de l'ecran virtuel                       */
    /****************************************************************************/
     
    void ClearBuffer(void)
    {
      memset(screen,0,320*200);
    }
     
     
    /****************************************************************************/
    /* ShowBuffer() : transfert l'ecran virtuel vers la zone d'ecran            */
    /****************************************************************************/
    void ShowBuffer(void)
    {
      memcpy((unsigned char *)(0xA000 << 4), screen, 320*200);
    }
     
    /****************************************************************************/
    /* MyInitGraph() : ouverture de l'ecran graphique et alloc ecran virtuel    */
    /****************************************************************************/
    void MyInitGraph()
    {
      int i;
     
      /* Allocation de l'ecran virtuel */
      screen=(unsigned char*)calloc(320*200,sizeof(unsigned char));
     
      /* passe en 320*200 256 couleurs */
      _setvideomode(19);
    }
    Apparement, la variable screen est un tampon dans lequel sont stockées les couleurs de chaque pixel puis il est recopier vers la zone mémoire de l'écran.
    La principale difficulté vient du fait que je ne connais pas du tout comment fonctionne ce mode. Quelqu'un sait comment à partir d'une valeur unsigned char (entre 0 et 255) du tableau, je peus arriver à décomposer la couleur en valeurs RGB ?

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par norwy
    Quelqu'un sait comment à partir d'une valeur unsigned char (entre 0 et 255) du tableau, je peus arriver à décomposer la couleur en valeurs 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
    #include <stdio.h>
     
    #define RGB(r, g ,b) ((r) |  ((g) << 8) | ((b) << 16))
     
    #define GetRValue(rgb) ((rgb) >> 16)
    #define GetGValue(rgb) ((rgb - (GetRValue (rgb) << 16)) >> 8)
    #define GetBValue(rgb) ((rgb - (GetRValue (rgb) << 16) - (GetGValue (rgb) << 8)))
     
    int main (void)
    {
      int rgb = RGB (0x55, 0x00, 0xff);
      printf ("%x : r=%x, g=%x, b=%x\n", rgb, GetRValue (rgb), GetGValue (rgb), GetBValue (rgb));
      return 0;
    }
    Tu peux surement faire mieux (en factorisant les décalages, par exemple) mais je te laisse t'amuser avec ce genre de chose, je préfère que ça soit lisible

  3. #3
    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 norwy
    Bonjour, (Je pense que c'est le bon endroit où poster le topic...)

    Je voudrais adapter un programme type "ancienne génération" fonctionnant apparement sous dos avec l'ancien mode de couleur 8 bits (256 couleurs) sur mon environnement graphique fonctionnant en mode RGB 24bits (1 octet par couleur donc).

    Ce que je ne comprend pas c'est comment fonctionne la lecture des couleurs.
    <...>
    La principale difficulté vient du fait que je ne connais pas du tout comment fonctionne ce mode. Quelqu'un sait comment à partir d'une valeur unsigned char (entre 0 et 255) du tableau, je peus arriver à décomposer la couleur en valeurs RGB ?
    Rien à voir avec le C. Il faut étudier la technologie EGA, les palettes etc. Quand tu auras compris comment fonctionne ton programme DOS, tu pourras le modifier pour gérer le RGB 24 bits.

    http://nemesis.lonestar.org/reference/video/ega.html

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 95
    Par défaut
    gege2061, je savais déjà faire cela

    Merci Emmanuel, je n'ai vraiment trouvé grand chose sur ton lien mais en cherchant sur les notions de palette notamment, j'ai découvert que chaque « donnée pixel » est codée sur un octet qui est l'index de la couleur 24 bits (dans le cadre de cet article) dans la palette de 256 couleurs de type "rgb palette[256]" voir code de gege2061.

    Merci.

  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 norwy
    Merci Emmanuel, je n'ai vraiment trouvé grand chose sur ton lien
    Oui, désolé, je pensais qu'il couvrait tous les aspects hardware (je ne l'ai utilisé que pour les ports de communication).

    Ceci est mieux.

    http://nemesis.lonestar.org/reference/video/ega.html

Discussions similaires

  1. obtenir une couleur en format rgb
    Par Arrakis dans le forum GTK+ avec Python
    Réponses: 7
    Dernier message: 19/03/2012, 11h20
  2. Comment trier des couleurs (nom, hexa, rgb..) ?
    Par Perplexe dans le forum Webdesign & Ergonomie
    Réponses: 4
    Dernier message: 14/01/2011, 12h14
  3. Convertir du code couleur héxa vers RGB?
    Par bylka dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/01/2009, 11h25
  4. palette de couleur pastel aléatoire RGB
    Par Taillise dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/05/2008, 10h23
  5. [VB.NET] Brush avec couleur définie en RGB
    Par jennings dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/12/2004, 08h41

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