Le monochrome
But : partir d'une image couleur pour la convertir en une image monochrome.
Cela veut donc dire:
Convertir les niveaux d'intensités des 3 couleurs primaires en 1 niveau d'intensité pour la couleur monochrome. On pourra donc convertir une image couleur en une image avec dégradé de gris, mais aussi en dégradé vert (comme les vieux moniteurs verts), orange ou tout autre couleur.
Une solution consitera donc à additionner les 3 niveaux d'intensités et de diviser le résultat par 3. Ce qui nous donne une valeur moyenne des ces niveaux qui sera utilisée comme nouveau niveau d'intensité.
Il ne restera alors plus qu'à reporter cette valeur moyenne sur les couleurs primaires utilisées pour obtenir la couleur monochrome souhaitée.
Exemple simplifié de programme en assembleur:
**************************************
*** Image couleur en monochrome ***
*** En entrée : ***
*** A0.l Tampon des couleurs ***
*** A1.l Tampon monochrome ***
*** D0.w Nbre de couleurs-1 ***
*** D1.w Plan RVB ex.:R&B=%101 ***
*** En sortie : maj du tampon monochrome ***
**************************************
xdef monochrome
monochrome movem.l d0/d2-d7/a0-a1,-(a7) move.w #%111,d5 move.w #4,d7 /* Calculer le niveau moyen */ bnb clr d6 moveq #0,d2 move.b (a0)+,d4 move.b (a0)+,d2 move.w d2,d3 asr d7,d3 and.w d5,d2 and.w d5,d3 and.w d5,d4 add.w d3,d2 add.w d4,d2 divs #3,d2
/* Affecter cette valeur aux couleurs primaires demandées */ btst #0,d1 beq vok move.w d2,d6 vok asl d7,d2 btst #1,d1 beq rok or.w d2,d6 rok btst #2,d1 beq fok asl d7,d2 or.w d2,d6
fok move.w d6,(a1)+ /* Boucler sur le nombre de couleurs demandées */ dbf d0,bnb movem.l (a7)+,d0/d2-d7/a0-a1 rts
end
Dans cet exemple, on ne peut indiquer que les couleurs primaires à utiliser
en sortie. mais ces niveaux seront affectés par la valeur moyenne calculée.
ceci sans prise en compte d'une valeur éventuellement déjà
positionnée.
Il n'est donc pas possible d'initialiser les niveaux d'origines permettant d'avoir
une couleur bien précise de la couleur monochrome.
Il faudrait donc modifier ce code pour permettre cela. Attention alors à
ne pas oublier les valeurs maxi et mini des niveaux. (exemple sur un STF, il
ne faut pas dépasser la valeur 7). Toutes valeurs supérieures
à 7 doivent être ramenées à 7).