Section courante

A propos

Section administrative du site

Sommaire


Introduction

Vous serez sans doute fasciner par l'affichage de vos premières routines vidéo pour tracer un pixel ou une ligne mais comment avoir une interprétation conforme aux couleurs telle qu'on vous les as appris. Après divers recherche personnel, je n'ai hélas jamais trouver de véritable information sur le sujet outre ceux contenu dans le Griform. Toutefois, ce n'est pas une raison pour que vous ayez les mêmes problèmes que j'ai rencontrer, et pour cette raison je consacre cette page pour renverser cette tendance des plus généraliser!!!

Transformation du RVB (RGB) en 16 couleurs

Voici donc tout d'abord une routine en langage de programmation PASCAL permettant de transformer des couleurs RVB en une couleur conforme d'un mode 16 couleurs:

Function RGB2Color(R,G,B:Byte):Word;Var Color:Byte;Begin
Color:=0;
If(R)and$80=$80Then Color:=Color or$04;
If(R)and$40=$40Then Color:=Color or$20;
If(G)and$80=$80Then Color:=Color or$02;
If(G)and$40=$40Then Color:=Color or$10;
If(B)and$80=$80Then Color:=Color or$01;
If(B)and$40=$40Then Color:=Color or$08;
RGB2Color:=Color and$F;
End;

Et si vous l'avez correctement compris, voici maintenant les mêmes fonctions écrit en assembleur en ligne du PASCAL:

Function RGB2Color(R,G,B:Byte):Word;Assembler;ASM
XOR BX,BX
MOV AL,R
MOV AH,AL
AND AL,080h
OR AL,AL
JZ @1
MOV BL,04h
@1:AND AH,040h
OR AH,AH
JZ @2
OR BL,20h
@2:MOV AL,G
MOV AH,AL
AND AL,080h
OR AL,AL
JZ @3
OR BL,02h
@3:AND AH,040h
OR AH,AH
JZ @4
OR BL,10h
@4:MOV AL,B
MOV AH,AL
AND AL,080h
OR AL,AL
JZ @5
OR BL,01h
@5:AND AH,040h
OR AH,AH
JZ @6
OR BL,08h
@6:XCHG AX,
BX
END;

Transformation du RVB (RGB) en 32768 couleurs

Faisant suite à la conversion de couleurs précédente, voici maintenant une routine RVB en une couleurs 15 bits d'un mode d'affichage de 32768 couleurs.

Function RGB2Color(R,G,B:Byte):Word;Assembler;ASM
MOV AL,B
MOV AH,G
MOV BL,R
{$IFOPT G+}
SHR AH,3
{$ELSE}
SHR AH,1
SHR AH,1
SHR AH,1
{$ENDIF}
AND BL,11111000b
{$IFDEF G+}
SHR AX,3
{$ELSE}
SHR AX,1
SHR AX,1
SHR AX,1
{$ENDIF}
SHR BL,1
OR AH,BL
XOR DX,DX

END;

Transformation du RVB (RGB) en 65536 couleurs

Voici maintenant une fonction écrite en assembleur permettant de convertir une couleur RVB en une couleur 16 bits d'un mode d'affichage de 65536 couleurs.

Function RGB2Color(R,G,B:Byte):Word;Assembler;ASM
MOV AH,R
AND AH,0F8h
MOV AL,B
{$IFOPT G+}
SHR AL,3
{$ELSE}
SHR AL,1
SHR AL,1
SHR AL,1
{$ENDIF}
MOV BL,G
AND BX,00F8h
{$IFOPT G+}
SHR BX,3
{$ELSE}
SHL BX,1
SHL BX,1
SHL BX,1
{$ENDIF}
ADD AX,BX

END;

Conversion du CMYK à RVB (RGB)

Voyant que vous êtes difficiles impressionnable, et ne voulant surtout pas perdre votre attention, voici maintenant une routine de transformation de couleur d'un format à un autre. A titre purement informatif, le format CMYK est particulièrement employé sur les imprimantes à Jet d'encre, tandis que le format RVB pour l'affichage vidéo comme vous le savez sans doute. La procédure suivante permet de transformer des couleurs de format CMYK à format RVB (RGB).

Type RGB=Record
R,G,B:Byte;
End;
Procedure CMYK2RGB(C,Y,M,K:Byte;Var Q:RGB);
Var
tk:Real;
Begin
tk:=(255-k)/255;
Q.R:=Round(C*tk+K);
Q.G:=Round(Y*tk+K);
Q.B:=Round(M*tk+K
);
End;

Affichage du Cube RVB en 3 dimensions

J'ai longuement hésiter tant qu'a savoir si je devais mettre ou non un exemple d'affichage du Cube RVBen 3 dimensions dans une page comme celle-ci... Est-ce vraiment utile? Il semblerait que certain sens oui, puisque je considère que cela permettra pour plusieurs de développer leur imagination dans un sens pratique du traitement des couleurs. Le concept de l'image suivante est fort simple il faut créer des coordonnées en 3 dimensions de façon à égaler toujours la même somme total en coordonnée lorsqu'on affiche une couleur. Voici donc l'aspect obtenu avec le programme RGBBOX.PAS:


Dans ce programme fonctionnant malheureusement exclusivement en mode 640x480 en 65536 couleurs, vous pourrez comprendre le potentiel d'un code source aussi dénudé. Le coeur même de l'application de ce cube réside en ses trois lignes de code PASCAL:

For J:=99downto 0do For I:=0to 99do SetPixel3D(I,J,99,RGB2Color(I,J,99));
For K:=0to 99 do For I:=0to 99do SetPixel3D(I,99,K,RGB2Color(I,99,K));
For J:=99downto 0do For K:=0to 99do SetPixel3D(99,J,K,RGB2Color(99,J,K));

Si vous n'êtes pas capable d'imaginer qu'il s'agit des trois faces visibles alors je vous suggère d'afficher les points un par de toute la surface avec la routine suivante:

For K:=0to 99do For I:=0to 99do For J:=0to 99do Begin
SetPixel3D(I,J,K,RGB2Color(I,J,K
));
End
;


Dernière mise à jour : Dimanche, le 1 mai 2016