SDL logo

C. Drocourt - 2006

drocourt@iut-amiens.fr

TD01 - Les couleurs

logo iut

Généralités

Le codage des images se représente essentiellement en deux grandes catégories :
- Le codage sans perte (avec ou sans compression),
- Le codage avec perte.

La représentation la plus simple d'une image est d'utiliser une suite d'octets représentant les pixels de l'image :
- Pour une image en noir et blanc, un seul bit est nécessaire par pixel (00110 : Noir,Noir,Blanc,Blanc,Noir), la taille de l'image est donc largeur x hauteur (en bits), soit pour une image 800 x 600 = 480 000 bits, soit 60 000 octets, soit environ 58 Ko.
- Pour une représentation en niveau de gris on utilisera généralement un octet par pixel (255 niveaux de gris possibles), la taille de l'image est donc largeur x hauteur (en octets), soit pour une image 800 x 600 =  480 000 octets, soit 468,75 Ko.
- Enfin couleur ...

Pour une représentation en couleur, plusieurs solutions possibles (sans compression) :
- RVB (RGB) : Le codage d'une couleur est généralement donné par trois composantes : Rouge, Vert et Bleu (cf. ci-dessous) d'où le terme RVB ou RGB en anglais. L'idée est donc d'utiliser un certain nombre d'octets par composantes. Par exemple, si l'on utilise 1 octet par composante (ce qui est le cas général mais qui n'est pas une obligation, ceci peut être plus ou moins), la couleur 0,0,0 représente le noir et 255,255,255 le blanc. Soit pour une image 800 x 600 x 3 = 1 440 000 octets, soit 1406,25 Ko, soit environ 1,4 Mo.
- RVBA : Idem ou format précédent, mais on ajoute un composant Alpha pour la transparence. Soit pour une image 800 x 600 x 4 = 1 920 000 octets, soit 1875 Ko, soit environ 1,85 Mo.
- Palette : Dans certains cas, l'utilisation d'un certains nombre de couleurs en simultané est suffisant, par exemple, si l'on se fixe 255 couleurs maximum sur un espace RGB de 255,255,255, l'image va occuper une taille de 480 000 octets, reste à insérer la palette de la forme Indice X (1 octet) = ROUGE, VERT, BLEU (3 octets), ce qui fait 4 * 255 = 1020 octets, d'où un total de 481 020 octets, soit environ 470 Ko pour l'image totale.

Le codage d'une image avec perte est généralement utilisé pour des application comme internet, ou il permet une grande compression, d'ou une réduction de la taille du fichier.

Il est a noter qu'en imagerie numérique, on travail en synthèse additive, avec les trois composantes RVB, une incrémentation d'une composante augmente la luminosité de cette dernière, et donc tend vers une couleur plus claire. Cette représentation est utilisé sur l'ensemble des suports dynamique d'images : Télévision, écran plasma, videoprojecteur, c'est a dire des sources avec apports de lumière.
Un autre type de synthèse existant est la soustractive travaillant également avec trois couleur : Cyan, magenta et jaune, dont l'ajout des composantes donne une couleur plus foncée. Cette représentation est utilisé sur des supports statiques : Peinture, impression, ... c'est a dire partant d'une source lumineuse, et ajoutant des filtres passifs. Cette deuxième représentation est appelée CMJ. Il est a noter qu'en théorie, l'ajout de ces trois composantes donne le noir, en pratique ceci n'est pas vérifié, ainsi, en imprimerie on utilisera une quatrieme composante : le Noir, on parlera alors de CMJN.

Exercice :
A l'aide de l'une des fonctions de tracé de portion de cercle (cf. ci-dessous) de la librairie SDL_gfx (#include <SDL_gfxPrimitives.h> et -lSDL_gfx sur la ligne de compilation), vous représenterez sur un cercle l'évolution des couleurs RVB, idem pour le CMJ.

Exemple :

exemple

Prototypes des fonctions :
Pie 
int pieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color);
int pieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a);

Filled Pie
int filledPieColor(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint32 color);
int filledPieRGBA(SDL_Surface * dst, Sint16 x, Sint16 y, Sint16 rad, Sint16 start, Sint16 end, Uint8 r, Uint8 g, Uint8 b, Uint8 a);