Sommaire
- Transformation du RVB (RGB) en 16 couleurs
- Transformation du RVB (RGB) en 32768 couleurs
- Transformation du RVB (RGB) en 65536 couleurs
- Conversion du CMYK à RVB (RGB)
- Affichage du Cube RVB en 3 dimensions
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;