Conversions couleur / rvb / hsi (optimisé)

Soyez le premier à donner votre avis sur cette source.

Vue 11 772 fois - Téléchargée 431 fois

Description

Conversions Variable_Couleur / Rouge_Vert_Bleu / Hue_Saturation_Intensité dans tous les sens (Module + exemple)

##############################
Un peu de théorie...
##############################

Une couleur peut être codée principalement de 3 façons différentes :
COULEUR, RVB, et HSI

1°) La COULEUR elle-même sur 24 bits, soit 16 millions de couleurs (exatement 16777216)
- 8 bits rouge
- 8 bits vert
- 8 bits bleu

2°) Ses 3 composantes RVB (Rouge, Vert, Bleu) ou RGB en anglais (Red, Green, Blue)
- R - Rouge de 0 à 255, soit 256 niveaux de rouge
- V - Vert de 0 à 255, soit 256 niveaux de vert
- B - Bleu de 0 à 255, soit 256 niveaux de bleu
Combinaisons des 3 = 256*256*256 = 16 milions de couleurs (le compte est bon)

Couleur = (((bleu x 256) + vert) x 256) + rouge
= rouge + (256 x vert) + (65536 x bleu)

3°) Sa correspondance HSI (Hue*, Saturation, Intensity) en anglais
Abréviation française souvent utilisée : TSL (Teinte, Saturation, Luminosité)
(* prononcer "YOU")
- H : Hue = Teinte
- S : Saturation = Saturation
- I : Intensity = Luminosité

La Teinte (HUE) correspond à la couleur dominante :
Valeurs de 0 à 239 :
- 0 = rouge
- 20 = orange (rouge + un peu de vert)
- 40 = jaune (rouge + vert)
- 80 = vert
- 120 = bleu ciel (vert + bleu)
- 160 = bleu
- 200 = violet (bleu + rouge)
- 239 = presque rouge

Exemple : Teinte ROUGE (valeur 0) et ses variations de Saturation et de Luminosité :
- rouge (rouge)
- rouge foncé (marron)
- rouge très foncé (noir)
- rouge clair (rose)
- rouge très clair (blanc)
- rouge pâle (gris)

La Saturation (SATURATION) correspond contraste de couleur :
Valeur de 0 à 240 :
- 0 : Vous avez encore une télé en noir et blanc ?!
- 240 : Attention les yeux !

La Luminosité (INTENSITY) est la notion de sombre ou clair :
Valeur de 0 à 240 :
- 0 : Qui a éteint la lumière ?!
- 220 : Vive les lunettes de soleil !
- 240 : Blanc.
- 120 : Là, c'est beaucoup mieux.

#####################
En pratique
#####################

"Couleur.bas" est un module comportant toutes les fonctions de conversions de couleurs dont vous aurez besoin.

"Couleur_RVB_HSI.vbp" est une petite application pédagogique utilisant mon module Couleur.bas.
Résolution minimum : 800 x 600

Le but : comprendre le principe de conversion RVB <-> HSI

Source / Exemple :


Call Fichier_Zip("Rien de tel qu'une bonne démo !")

'################################################################
'
'     UTILISATION DES 4 FONCTIONS SUIVANTES (by Columbiad)
'
'     - Couleur_2_RVB()
'     - Couleur_2_HSI()                                      
'     - RVB_2_HSI()
'     - HSI_2_RVB()
'
'################################################################
'
'Voici toutes les conversions possibles en une seule ligne :
'-----------------------------------------------------------
'
'A PARTIR D'UNE COULEUR :
'------------------------
'Convertir une COULEUR en R,V,B :
'    Call Couleur_2_RVB(COULEUR, R, V, B)
'      ou
'    Couleur_2_RVB COULEUR, R, V, B
'
'Convertir une COULEUR en H,S,I :
'    Call Couleur_2_HSI(COULEUR, H, S, I)
'      ou
'    Couleur_2_HSI COULEUR, H, S, I
'
'Convertir une COULEUR en H,S,I et en R,V,B :
'    Call Couleur_2_HSI(COULEUR, H, S, I, R, V, B)
'      ou
'    Couleur_2_HSI COULEUR, H, S, I, R, V, B
'
'
'A PARTIR DES COMPOSANTES RVB :
'------------------------------
'Convertir R, V, B en COULEUR :
'    COULEUR = RGB(R, V, B)
'
'Convertir R,V,B en H,S,I :
'    Call RVB_2_HSI(R, V, B, H, S, I)
'      ou
'    RVB_2_HSI R, V, B, H, S, I
'
'Convertir R,V,B en H,S,I et en COULEUR :
'    COULEUR = RVB_2_HSI(R, V, B, H, S, I)
'
'
'A PARTIR DE LA CORRESPONDANTE HSI :
'-----------------------------------
'Convertir HSI en COULEUR :
'    COULEUR = HSI_2_RVB(H, S, I)
'
'Convertir HSI en RVB :
'    Call HSI_2_RVB(H, S, I, R, V, B)
'      ou
'    HSI_2_RVB H, S, I, R, V, B
'
'Convertir HSI en RVB et en COULEUR :
'    COULEUR = HSI_2_RVB(H, S, I, R, V, B)
'
End

Conclusion :


PS : Vous trouverez parfois la SATURATION ou l'INTENSITE en pourcentages
(valeurs de 0 à 100)
-> Il vous suffira de les multiplier par 2,4 avant de les utiliser.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_windob
Messages postés
225
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
25 août 2008
-
Pour chipoter :
Hue = Teinte en français
L'abréviation la plus souvent utilisée en français est TSL pour Teinte Saturation Luminosité.
clock
Messages postés
6
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
9 décembre 2007
-
Super travail , voici 2 ans que je cherche à convertir une couleur d'un pixel en une donnée numérique équivalente ...... Merci !
Je te donne 10/10 ....
Biensur , sur ce site il y à quantité de progs parlant de se sujet
cependant plus claire , plus accomplis que ça , non !!..
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
22 août 2018
54 -
optimisé, je ne sais pas, reste que tu semble bien maitriser ton sujet
Columbiad
Messages postés
1
Date d'inscription
lundi 20 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2007
-
Merci CLOCK ! Je me suis efforcé de rendre mes explication aussi claires que possible. Je suis heureux d'avoir pu te rendre ce service.
---
Renfield : Si tu me trouves des fonctions de conversion plus réduites que dans le module Couleur.bas, je suis preneur (^_^). (L'optimisation ne porte que sur ce module, l'appli de démo n'est là que pour comprendre les conversions RVB/HSI, un peu bourrin je l'avoue, mais ça fonctionne...)
---
Salutations à toutes et tous (^_^)
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
22 août 2018
54 -
j'avais pas mal bossé avec ce genre de conversion...

concernant l'optimisation, voici de betes exemples...

MIN(MIN(R, V), B)
induit deux appels de fonction, donc deux passages de parametres, etc...
fais une fonction Min3... par exemple

les divisions sont plus couteuses en nombre de cycles que les multiplications...
/2 se dit * 0.5

Couleur_2_RVB est à recoder en calculs, sans passage par la case String
(voir http://www.vbfrance.com/codes/RGB-VICE-VERSA-TRES-RAPIDE_40189.aspx)

tu pourrais sans doute utilise des Byte, mais quitte a ne pas le faire, utilises des Long plutot que des Integer, les processeurs 32 bits prefereront...


If I < 240 / 2 Then
ColorL = (I / 240) * (1 - (S / 240))
ColorH = (I / 240) * (1 + (S / 240))
Else
ColorL = (I / 240) - (1 - (I / 240)) * (S / 240)
ColorH = (I / 240) + (1 - (I / 240)) * (S / 240)
End If
dans ce genre de cas, il peut etre fructueux de mettre en cache les calculs intermédiaires (tes divisions)


j'ai pas tout suivit de la logique appliquée, a toi de voir s'il n'est pas possible d'utiliser des ElseIf... (cas qui s'exclueraient les uns les autres)
If V Color1 And R Color3 Then Plage = 6: Color2 = B: sens = -1
If V Color1 And B Color3 Then Plage = 4: Color2 = R: sens = 1
If R Color1 And B Color3 Then Plage = 4: Color2 = V: sens = -1
If R Color1 And V Color3 Then Plage = 2: Color2 = B: sens = 1
If B Color1 And V Color3 Then Plage = 2: Color2 = R: sens = -1
If B Color1 And R Color3 Then Plage = 0: Color2 = V: sens = 1

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.