
Dans ce chapitre vous saurez tout sur les pixels :
De quoi ils sont composés, pourquoi il existe différentes profondeurs ou encore comment en déterminer la couleur.
Attention, certaines choses que vous allez lire dans ce chapitre sont spécifique à la SDL et/ou ne sont pas à prendre pour des vérités générales !
Commençons par le commencement, une petite définition :
Selon Wikipedia : "Le pixel (px en abrégé), ou point, est l'unité de base d'une image numérique. Son nom provient de la locution anglaise picture element, qui signifie, « élément d'image » ou « point élémentaire ». Certains documents (d'origine IBM) parlent aussi de pel.
C'est le point minimal adressable par le contrôleur vidéo. C'est par exemple l'unité utilisée pour spécifier les définitions d'affichage (largeur × hauteur)."
Avec la SDL, tout ce que vous voyez à l'écran n'est que surface.
Des surfaces en 2 dimensions composées de... pixels.
Comme l'indique la définition, le pixel est donc le plus petit élément constitutif de ces surfaces.
Ainsi quand on parle de la taille (ou définition) d'une surface, on l'exprime en pixel.
Par exemple une surface de 800x600 est une surface de 800 pixels de largeur pour 600 de hauteur.
Comme vous le savez les pixels peuvent être de différentes couleurs, qui couvrent tout le spectre visible par l'oeil humain.
Mais comment cela se traduit il de manière informatique ?
Qu'est-ce qui différencie un pixel noir d'un pixel blanc ?
Avant de pouvoir répondre à ces questions il faut savoir de quoi est constitué un pixel.
Et bien de 4 composantes :
Chacune de ces composantes peut avoir 256 valeurs possibles, de 0 à 255. Evidemment plus cette valeur est élevée et plus la composante est forte.
Pour avoir un pixel rouge vif par exemple, les valeurs à adopter sont les suivantes :
Maintenant nous pouvons répondre à la première question un peu plus haut.
Mais comment cela se traduit il de manière informatique ?
Pour le savoir, il faut considérer la manière dont un pixel est stocké en mémoire.
Et c'est là qu'intervient la notion de profondeur de codage d'un pixel.
Quoi qu'il arrive, un pixel est toujours stocké dans une variable.
Mais selon la taille de cette variable, le pixel pourra avoir plus ou moins de couleurs différentes.
Commençons par étudier le cas des Uint32 :
Sachant qu'un Uint32 est tout simplement une variable de 32 bits non signée, vous vous demandez peut être comment on peut réussir à stocker les 4 composantes d'un pixel à l'intérieur.
Pour le comprendre il faut réfléchir en binaire.
Sur les 32 bits, imaginons qu'il y en ait 8 réservé pour la composante R, 8 autres pour la G, 8 autres pour la B, et les 8 derniers pour la A.
8 bits, soit un octet, permettent d'avoir 256 valeurs possibles.
Tient ! Comme le hasard fait bien les choses. :D
Histoire de bien visualiser la chose, nous vous avons préparés un petit schéma :

Vous pouvez voir les 32 bits, découpés en 4 parties, et les digits hexadécimaux correspondants (on va en voir l'utilité juste après ;) ).
Méfiez vous de l'ordre des composantes à l'intérieur de la variable.
Ici nous avons choisi ARGB, mais rien ne garantie qu'il en sera toujours ainsi, on peut très bien tombé sur des pixels codés en RGBA ou autre. ;)
Et bien nous croyons avoir répondu à la seconde question qui était :
Qu'est-ce qui différencie un pixel blanc d'un pixel noir ?
Toujours en prenant l'ordre ARGB, l'intérieur d'une variable stockant un pixel blanc vaut :
Les 8 premiers bits sont à 0 pour indiquer que la composante alpha est nulle, le pixel est complètement opaque.
Et les 24 derniers indiquent que les 3 composantes de couleurs sont au maximum. :)
Le pixel noir est encore plus simple :
Vous comprenez maintenant pourquoi on préfère définir un pixel à l'aide de sa valeur hexadécimal.
Si on veut créer un pixel blanc opaque, il suffit de faire :
Uint32 pixBlanc = 0x00FFFFFF;
Et voilà, ce n'est pas plus compliqué. :)
Encore une fois méfiez vous de l'ordre des composantes à l'intérieur de votre variable.
S'il n'est pas ce que vous imaginez vous risquez d'avoir des surprises avec votre couleur. ^^
Nous venons de voir comment sont déterminées les couleurs dans un pixel codé sur 32 bits. (true color)
Avec un octet par composante on atteint les 16 millions de couleurs sans compter la composante alpha.
Mais il existe d'autres profondeur de codage que 4 octets par pixel.
Nous n'allons en voir qu'une seule puisque nous n'en aurons pas besoin de plus, il s'agit de la palette de couleur (colormap) où chaque pixel est codé sur un octet.
La théorie est simple (et la pratique aussi d'ailleurs ^^ ), on commence par créer un tableau de 256 cases contenant chacune une couleur, puis chaque pixel va contenir l'adresse d'une case du tableau.
Ainsi l'image ne pourra contenir que 256 couleurs au maximum.
Il existe une autre technique pour coder les couleurs avec un octet seulement.
Elle consiste à "découper" l'octet en 4 et à donner 2 bits pour chaque composantes (comme pour le true color).
On peut ainsi obtenir 256 couleurs au maximum.
Mais l'avantage de la palette de couleur est que les 256 couleurs qu'elle peut contenir n'ont pas de "composantes obligatoires".
Le tableau de 256 cases contient des couleurs codées sur 32 bits, l'essentiel est qu'il ne dépasse pas 256 cases, la taille d'un octet.
Par conséquent si nous avons une image dans les tons bleu - vert où il n'y a quasiment pas de rouge, la palette aura l'avantage de proposer des dégradés bien plus fins dans les composantes bleu - verte car elle n'aura pas obligation de stocker des couleurs contenant du rouge.
Alors que le codage par division de l'octet sera beaucoup plus limité car quoi qu'il arrive il réservera 2 bits pour la composante rouge. (voir plus s'il n'y a pas de composante alpha)
Bien comprendre les pixels est très utile pour plusieurs raison :
Déjà, grâce à cette connaissance, vous pouvez coder tout un tas d'effets sympas sur vous images. :D
Ensuite, vous comprendrez bien mieux certaines fonction assez bas niveau par la suite.