MODIFIER LES COULEURS COMME UN DALTONIEN LES VOIT

cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007 - 2 déc. 2003 à 13:56
cs_tobby Messages postés 17 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 9 mars 2010 - 3 déc. 2003 à 12:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18354-modifier-les-couleurs-comme-un-daltonien-les-voit

cs_tobby Messages postés 17 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 9 mars 2010
3 déc. 2003 à 12:12
Voila le module complet avec le ratio :

Tobby.


Option Explicit
Public Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function SetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Global rRed As Long, rBlue As Long, rGreen As Long
Global CoefRed As Double, CoefBlue As Double, CoefGreen As Double
Dim ratio As Double

'Une fonction qui sépare les couleurs rouge vert et bleu d'un point
Public Function RGBfromLONG(LongCol As Long)
Dim Blue As Double, Green As Double, Red As Double
Blue = Fix((LongCol / 256) / 256)
Green = Fix((LongCol - ((Blue * 256) * 256)) / 256)
Red = Fix(LongCol - ((Blue * 256) * 256) - (Green * 256))
rRed = Red
rBlue = Blue
rGreen = Green
End Function

'la fonction en elle même
Public Sub PasRouge(picBox1 As PictureBox, picBox2 As PictureBox)

' ces coefficients sont a adapter au degre de daltonisme
CoefRed = 1
CoefBlue = 0.5
CoefGreen = 0.5

On Error Resume Next
Dim h As Integer, W As Integer
Dim C As Long, A As Long, B As Long
picBox2.ScaleMode = 3
picBox1.ScaleMode = 3
'boucle qui permet de scanner chaque point de l'image
For h = 0 To picBox1.ScaleHeight
For W = 0 To picBox1.ScaleWidth
'récupere la couleur du point M(h,W)
C = GetPixel(picBox1.hDC, W, h)
'et décomposer ses couleurs
RGBfromLONG C

'boucle qui permet de comparer le taux de rouge par rapport aux autres
'couleurs et réduire sa valeur
'For A = 0 To 255
' For B = -255 To 0
' If rRed >= A Then
' If (rBlue + rGreen) / 2 <= B Then
' rRed = rRed - (A + B)
' B = B - 2
' End If
' End If
' DoEvents
' Next B
'Next A

'If rRed < 0 Then
' rRed = 0
'End If

' If rRed > CoefGreen * rGreen + CoefBlue * rBlue Then
' rRed = rRed / CoefRed
' End If

' calcule le rapport entre le rouge et les autres couleurs
ratio = rRed / (CoefGreen * rGreen + CoefBlue * rBlue)
' interdit l'augmentation du niveau du rouge
If (CoefRed * ratio) > 1 Then
' reduit le rouge proportionnelement a son coef et a son rapport
rRed = rRed / (CoefRed * ratio)
End If


DoEvents

'stocke les couleurs du nouveau point dans C
C = RGB(rRed, rGreen, rBlue)
'et affiche le point
SetPixel picBox2.hDC, W, h, C
Next W
Next h
End Sub
SonicK02 Messages postés 14 Date d'inscription dimanche 16 novembre 2003 Statut Membre Dernière intervention 2 avril 2004
2 déc. 2003 à 20:47
juste une précision : j'ai trouvé un site avec des images qui pourraient illustrer mes propos, le résultat que je veux obtenir :

http://perso.wanadoo.fr/tiphaine.louis/Experiences.htm

voila

SonicK02
SonicK02 Messages postés 14 Date d'inscription dimanche 16 novembre 2003 Statut Membre Dernière intervention 2 avril 2004
2 déc. 2003 à 20:43
T'inquète pas Dede y'a pas de problème c'est vrai que soumettre un programme qui n'est pas encore finit sur le site n'est pas tellement judicieux...
Moi je cherche toujours à avoir un bon résultat tout en ayant un programme rapide, ce n'est pas facile.
Tout ce que j'ai obtenu pour l'instant c'est des images dont la couleur rouge est réhaussée ou diminuée mais en affectant les autres couleurs !

SonicK02
cs_Dede Messages postés 61 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 24 juillet 2006
2 déc. 2003 à 19:45
Rien de mechant dans mon commentaire.
L'idee me parrait bonne, mais je pense que ce n'est pas l'emplacement ou il devrait etre. Les problemes que tu soummets sont plutot du ressort du forum. A part cela, aucune agressivite, et je ne me place pas plus haut que toi en prog.
Bonne continuation,
Dede.
SonicK02 Messages postés 14 Date d'inscription dimanche 16 novembre 2003 Statut Membre Dernière intervention 2 avril 2004
2 déc. 2003 à 18:31
D'abord je répond à DeDe car je sais que le daltonisme est plus complexe mais tu n'as pas du regarder la source de très près. Je le sais très bien car je fais ce programme à cause de mes études et je fais un exposé sur ce sujet...
En tout cas ce source sera mis à disposition dès qu'il sera entièrement fini et concernera toutes les couleurs. Je me uis juste intéressé au rouge car le procédé pour les autres couleurs sera le même.
Enfin je voulais ajouter que il s'agit là de mon tout premier code en VB et en tout d'ailleurs...

Merci beaucoup Tobby pour tes commentaires
J'ai regardé ta partie mais j'ai déja réussi à réaliser cet effet mais c'est vrai qu'il n'est pas du tout réaliste. La vraie difficulté de ce programme est qu'il faut modifier le rouge en fonction des autres couleurs pour ne pas dégrader celles-ci, donc de faire un dégradé uniforme comme tu l'as dis. C'est pour cela que j'avais conçu deux boucles internes.
L'algorythme créé était de mon invention, mais il n'est pas très au point...
Ton systeme de ratio à l'air intéressant, je vais essayer de voir ça car la partie de code n'a pas l'air de marcher mais bon ca vient peut être de moi...

SonicK02
cs_tobby Messages postés 17 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 9 mars 2010
2 déc. 2003 à 17:24
Quelques petites erreurs, avec toutes mes excuses,
celui la est plus correct !

' calcule le rapport entre le rouge et les autres couleurs
ratio = rRed / (CoefGreen * rGreen + CoefBlue * rBlue)
' interdit l'augmentation du niveau du rouge
If (CoefRed * ratio) > 1 Then
' reduit le rouge proportionnelement a son coef et a son rapport
rRed = rRed / (CoefRed * ratio)
End If

Tobby.
cs_tobby Messages postés 17 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 9 mars 2010
2 déc. 2003 à 17:19
les coefs sont de types double et non long, sinon, les degrades ne sont pas uniformes !

voila une autre idee : c'est explique dans les commentaires !
(ajouter ratio en double). Ca remplace la detection precedente.

' calcule le rapport entre le rouge et les autres couleurs
ratio = rRed / (CoefGreen * rGreen + CoefBlue * rBlue)
' interdit l'augmentation du niveau du rouge
If ratio < 1 Then ratio = 1
' reduit le rouge proportionnelement a son coef et a son rapport
rRed = rRed / (CoefRed * ratio)


Tobby.
cs_tobby Messages postés 17 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 9 mars 2010
2 déc. 2003 à 17:02
il faudrait egalement prevoir un test lineaire et non par palier, pour eviter les effets "escalier"

Bref, y'a du boulot ! ;)

Tobby.
cs_tobby Messages postés 17 Date d'inscription jeudi 16 mai 2002 Statut Membre Dernière intervention 9 mars 2010
2 déc. 2003 à 16:58
Salut sonicK02 !

Il est interressant ton projet !
Mais connais-tu exactement l'algorithme de comparaison des couleurs ?
ou as tu creer arbittrairement le tien ?
Je t'en propose un autre (nettement plus rapide ! ;) mais qui n'est sans doute pas representatif de la realite..
le principe : tu renseignes des coefficiants pour le vert et le blue, qui correspondent au seuil de sensibilite de l'oeil pour ces couleurs. Ensuite, le coef pour le rouge est celui de reduction de la composante rouge.
C'est pas tres clair, mais tu comprendras mieux avec le code (seule la partie double boucle est modifiee, ainsi que l'ajout de 3 variables dans les declarations, qui devraient etre parametrables par l'utilisateur, les valeurs etants ici arbitraires) :



Option Explicit
Public Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function SetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Global rRed As Long, rBlue As Long, rGreen As Long
Global CoefRed As Long, CoefBlue As Long, CoefGreen As Long

'Une fonction qui sépare les couleurs rouge vert et bleu d'un point
Public Function RGBfromLONG(LongCol As Long)
Dim Blue As Double, Green As Double, Red As Double
Blue = Fix((LongCol / 256) / 256)
Green = Fix((LongCol - ((Blue * 256) * 256)) / 256)
Red = Fix(LongCol - ((Blue * 256) * 256) - (Green * 256))
rRed = Red
rBlue = Blue
rGreen = Green
End Function

'la fonction en elle même
Public Sub PasRouge(picBox1 As PictureBox, picBox2 As PictureBox)

CoefRed = 4
CoefBlue = 0.5
CoefGreen = 0.5

On Error Resume Next
Dim h As Integer, W As Integer
Dim C As Long, A As Long, B As Long
picBox2.ScaleMode = 3
picBox1.ScaleMode = 3
'boucle qui permet de scanner chaque point de l'image
For h = 0 To picBox1.ScaleHeight
For W = 0 To picBox1.ScaleWidth
'récupere la couleur du point M(h,W)
C = GetPixel(picBox1.hDC, W, h)
'et décomposer ses couleurs
RGBfromLONG C

'boucle qui permet de comparer le taux de rouge par rapport aux autres
'couleurs et réduire sa valeur
'For A = 0 To 255
' For B = -255 To 0
' If rRed >= A Then
' If (rBlue + rGreen) / 2 <= B Then
' rRed = rRed - (A + B)
' B = B - 2
' End If
' End If
' DoEvents
' Next B
'Next A

'If rRed < 0 Then
' rRed = 0
'End If

If rRed > CoefGreen * rGreen + CoefBlue * rBlue Then
rRed = rRed / CoefRed
End If

DoEvents

'stocke les couleurs du nouveau point dans C
C = RGB(rRed, rGreen, rBlue)
'et affiche le point
SetPixel picBox2.hDC, W, h, C
Next W
Next h
End Sub


j'espere que ca pourra t'aider un peu, si tu veux en discuter, n'hesite pas !

Tobby.
cs_Dede Messages postés 61 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 24 juillet 2006
2 déc. 2003 à 14:33
????????????
Un daltonien !

A mon avis, c'est plus complexe que tu ne le penses. Il existe different type de daltonisme et des degres divers et varies.
Termine, et je te donnerais mes impressions.
Dede.
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
2 déc. 2003 à 13:56
Oué pas tres au point, tres lent :-/ c'est domage, le but avait l'air intéressant. Essaye de le finir ;-)
Rejoignez-nous