IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

Problème de matrices et de conversion d'espaces de couleurs


Sujet :

Traitement d'images

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut Problème de matrices et de conversion d'espaces de couleurs
    Bonsoir,

    Les maths c'est pas mon fort, et si en plus c'est mal expliqué je suis vite noyé, alors envoyez la bouée de sauvetage !

    Je suis en train de lire "La gestion des couleurs pour les photographes, les graphistes et le prépresse" de J. Delmas chez Eyrolles, un pavé de 600 pages, et on commence avec une banane représentée en sRGB par 224 165 48 puis en CIERGB par 216 164 77.

    Ensuite page 26 l'auteur nous présente une matrice de conversion vers CIEXYZ qui se présente comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X  2.7690 1.7518 1.1300  R
    Y  1.0000 4.5907 0.0601  G
    Z  0.0000 0.0565 5.5943  B
    D'après ce que j'ai compris (nombreuses lectures du web), la matrice s'utiliserait ainsi :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X := R*2.7690 + G*1.7518 + B*1.1300;
    Y := R*1.0000 + G*4.5907 + B*0.0601;
    Z := R*0.0000 + G*0.0565 + B*5.5943;

    Le problème c'est que ça ne me donne absolument pas les valeurs indiquées par l'auteur, à savoir 47 44 7 :
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    source sRGB
    X 963.5430
    Y 984.3503
    Z 277.8489
     
    source CIERGB
    X 972.4092
    Y 973.5025
    Z 440.0271

    Voyant ces résultats erronés, je me suis dit qu'il fallait peut-être (sans doute !) travailler avec les composantes RBG ramenées à une échelle 0..1, comme utilisé partout sur le web (Bruce Lindbloom, EasyRGB, etc.), je me suis donc empressé de diviser mes RGB par 255, résultats toujours aussi minables :
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    source sRGB
    3.7786
    3.86019725490196
    1.08960352941176
     
    source CIERGB
    3.81336941176471
    3.8176568627451
    1.72559647058824

    Où est mon erreur ? Comment faites-vous vos conversions ?

    Ce que je ne comprends pas, c'est que Delmas nous donne une matrice avec des valeurs loin, très loin, très très très loin des valeurs de Lindbloom, regardez son tableau !
    Le problème c'est que lui aussi n'est pas très clair :
    In many cases, RGB values may first need conversion (for example, dividing by 255 and then raising them to a power).
    raising them to a power qu'il dit, le monsieur : ok, mais quelle valeur, son "a power" ?
    En plus il a bien écrit "in many cases", j'en déduis qu'il n'a pas écrit "in all cases" donc c'est quoi le critère d'application de la suite de la phrase ? Pas un mot là-dessus...

    Merci,

    EDIT : quand j'ai posté cette question, il me semble bien que j'avais écrit en titre "Problème de matrices et de conversion d'espaces de couleurs" et quelqu'un l'a changé, sans me demander mon avis avant et sans me prévenir non plus après.
    Au-delà du fait que je trouve ça très désagréable et un peu olé-olé, ça change aussi le sens de ma question et ça, c'est franchement du grand n'importe quoi, pour ne pas dire pire.

    EDIT de l'EDIT : je barre tout, les choses étant rentrées dans l'ordre.

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 148
    Points : 9 614
    Points
    9 614
    Par défaut
    Je viens de survoler l'article Wikipedia sur cette norme CIE XYZ.

    Et je vois que dans la codif CIE XYZ, on fait en sorte que la somme x+y+z donne 100. Ce n'est pas tout à fait le cas avec 44+47+7, mais disons que c'est un problème d'arrondis ?

    A partir de tes valeurs 963 984 et 277, il faut donc faire une transformation supplémentaire :
    x = 963 / (963+984+277)
    y = 984 / (963+984+277)
    z = 277 / (963+984+277)

    Ca ne va toujours pas donner nos 44 47 et 7. Mais on s'en approche.
    Peut-être que c'est ce fameux exposant qui nous manque.

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    x = 963 / (963+984+277)
    y = 984 / (963+984+277)
    z = 277 / (963+984+277)

    Ca ne va toujours pas donner nos 44 47 et 7. Mais on s'en approche.
    mais c'est trompeur ! Voilà ce que donne ta transformation :
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X 0.407558316248514
    Y 0.408016542586926
    Z 0.18442514116456
    Or en fait il nous faudrait 47 44 7 soit X > Y > (beaucoup supérieur !) Z alors qu'on récupère X < Y > (trop peu supérieur) Z

    Citation Envoyé par tbc92 Voir le message
    Peut-être que c'est ce fameux exposant qui nous manque.
    Pas sûr qu'un exposant réussisse à rattraper le défaut que j'indique...

    D'autres idées, les gens ?

    PS : merci pour la remise de mon titre comme à l'origine.

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Je viens de survoler l'article Wikipedia sur cette norme CIE XYZ.
    Bon, j'ai lu l'article en long en large et en travers, mes lacunes mathématiques sont flagrantes pour avancer, je l'avoue humblement, et sans parler des formules hautement kabbalistiques du milieu de page, est-ce que quelqu'un pourrait m'expliquer comment se servir (en Pascal, VB ou C) des matrices tout en bas de l'article ? Et pourquoi 2 fois la matrice M (dernière ligne) ?

    Et ligne précédente, c'est quoi une "puissance -1" ? J'ai fait l'essai avec une calculette et 2 et 4, je ne vois aucune différence entre "puissance 1" et "puissance -1",


    Sinon, je me suis livré à quelques calculs ou plutôt, à l'application de matrices différentes au cœur de la chaîne de calculs :

    Puisque Delmas donne XYZ à 47 44 7 pour la banane, on peut éliminer les calculs à base de CIERGB (216 164 77) car la matrice avec EasyRGB (2e ligne) donne pour X Y Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    42.9339166478496
    41.6856706135906
    12.8044554787852
    On est trop loin du compte.

    Ensuite, on peut comparer les résultats (classés par ordre croissant de X) de calculs effectués avec différentes matrices :
    Banane sRGB (224 165 48) avec Colorspace de Pascal Getreuer (sympathique programme en C permettant le trifouillage dans tous les sens) donne pour X Y Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    44.7281300113628
    42.9688186274132
    8.73222857345342
    Banane sRGB avec EasyRGB, 2e ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    44.7291039812028
    42.9709608757792
    8.73305174377828
    Banane sRGB avec National Instruments (pas des pieds nickelés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    44.7320745116422
    42.9746565709882
    8.73982112895864
    Banane sRGB avec Bruce Lindbloom et sRGB__D65 (je précise car il y en a plein) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    44.7322240642554
    42.9745224474328
    8.73469863596359
    Dans tous les cas X et Y sont trop bas et Z est trop haut pour atteindre les valeurs de Delmas. Quant aux résultats avec sa matrice, c'est, euh, comment dire ?, le bouquin par la fenêtre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    275.655946618753
    247.448710330445
    18.660860884442
    J'en suis là et ne peux plus avancer tant que ce point n'est pas réglé. Comment faire ?

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 695
    Points : 188 898
    Points
    188 898
    Par défaut


    Citation Envoyé par Jipété Voir le message
    Et ligne précédente, c'est quoi une "puissance -1" ? J'ai fait l'essai avec une calculette et 2 et 4, je ne vois aucune différence entre "puissance 1" et "puissance -1",
    Conventionnellement, un exposant négatif indique qu'on divise : Formule mathématique, Formule mathématique. Pour une matrice, c'est plutôt l'inverse de la matrice.

    Pour les jolies formules, l'idée est de prendre les trois composantes X, Y et Z comme un vecteur à trois dimensions, d'utiliser un produit matrice-vecteur (https://fr.wikipedia.org/wiki/Produit_matriciel), pour retrouver les composantes R, G et B. Si tu utilises la matrice M (et non son inverse), tu fais l'opération inverse : depuis RGB vers XYZ.

    Ou ce n'est pas la question ?

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par dourouc05 Voir le message
    Ou ce n'est pas la question ?
    C'était une partie de la question,

    Merci pour le lien et les explications, je serai moins bête face aux matrices.

    Il nous reste le mystère des valeurs de Delmas que je n'arrive pas à faire rentrer dans les bonnes "ranges", malgré tous les chausse-pieds essayés...

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Il nous reste le mystère des valeurs de Delmas que je n'arrive pas à faire rentrer dans les bonnes "ranges", malgré tous les chausse-pieds essayés...
    Bon ben c'est vraiment pas gagné, et si personne n'a d'idée, c'est mort...

    Car sur le site easyRGB (déjà cité) il y a un convertisseur, en haut à droite, je lui ai donné les couleurs RGB de la banane, et voilà les résultats :
    Nom : convert_from_easyrgb.png
Affichages : 370
Taille : 25,5 Ko

    Je suis pas mal déçu des valeurs de Delmas, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CIE L*a*b* 72 14 65
    CIE L*C*h* 72 66 78°
    HSV 41° 79% 87%
    car vu le nombre de chiffres après la virgule pour les valeurs dans les matrices, je m'attendais à des résultats plus précis : pour HSV par exemple, 0,11079 * 360 = 39,88 arrondi à 40 et Delmas nous sort 41... Mystère...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 681
    Points : 10 698
    Points
    10 698
    Par défaut
    Pour moi, c'est ton calcul qui est impossible Lorsque tu dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X  2.7690 1.7518 1.1300  R
    Y  1.0000 4.5907 0.0601  G
    Z  0.0000 0.0565 5.5943  B
    Moi je vois (un vecteur colonne [disons vect_XYZ]) * une matrice [disons mat] * (un vecteur colonne [disons vect_RGB]). Or il n'y a pas d'égalité

    Je ne vois pas vect_XYZ = mat * vect_RGB

    Et l'autre problème est que
    • vect_XYZ * mat est impossible
    • mat * vect_RGB donne un vecteur colonne. Or on ne peut pas multiplier 2 vecteurs colonne

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je ne vois pas vect_XYZ = mat * vect_RGB
    Comme ça c'est mieux ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | X |   | 2.7690 1.7518 1.1300 |  | R |
    | Y | = | 1.0000 4.5907 0.0601 |  | G |
    | Z |   | 0.0000 0.0565 5.5943 |  | B |
    C'est ex-ac-te-ment la page 26 du bouquin, si je la scannais on aurait la même chose.

    (Au départ je m'étais abstenu de jongler avec tous ces "|", je pensais que ça rendrait mal, mais tous comptes faits, ça fonctionne. Désolé pour l'incompréhension).

  10. #10
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème de matrices et de conversion d'espaces de couleurs


    Tu as bien tort de déprimer sur ce sujet: c'est un capharnaüm propre à dégoûter tout lecteur désireux d'y comprendre quelque chose.

    Citation Envoyé par Jipété Voir le message
    ... Je suis en train de lire "La gestion des couleurs pour les photographes, les graphistes et le prépresse" de J. Delmas chez Eyrolles, un pavé de 600 pages, et on commence avec une banane représentée en sRGB par 224 165 48 puis en CIERGB par 216 164 77.

    Ensuite page 26 l'auteur nous présente une matrice de conversion vers CIEXYZ qui se présente comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X  2.7690 1.7518 1.1300  R
    Y  1.0000 4.5907 0.0601  G
    Z  0.0000 0.0565 5.5943  B
    ...
    Il intervient en effet un produit matriciel J = M.I (pour s'en tenir à une notation neutre), mal présenté dans l'ouvrage, dans lequel figurent deux vecteurs colonnes (I, J), et une matrice carrée (M) d'ordre (3); et je crois qu'il ne représente pas la totalité de la conversion en cause.

    Pour cette matrice de conversion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <<  2.7690  1.7518  1.1300  >   
     <  1.0000  4.5907  0.0601  >
     <  0.0000  0.0565  5.5943  >>
    la somme des éléments de chaque ligne est constante (w = M[i, 1] + M[i, 2] + M[i, 3] = 5.6508 pour i = 1, 2, 3), et la matrice correspondante (M' = (1/w)*M) figure dans l'article suivant.
    Comme il y est question de luminance relative et d'efficacité lumineuse, j'ai la fâcheuse impression qu'il va falloir reprendre la fonction L(r, g, b) dont on a déjà eu l'occasion de parler.

    Je n'ai pas le temps de poursuivre. Cherche du côté de la luminance relative - le lien a probablement été cité sur un autre forum, initié il y a un an ou deux.

    PS: Dans ce que tu viens de donner, il manque simplement un signe de multiplication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | X |   | 2.7690 1.7518 1.1300 |   | R |
    | Y | = | 1.0000 4.5907 0.0601 | * | G |
    | Z |   | 0.0000 0.0565 5.5943 |   | B |

  11. #11
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème de matrices et de conversion d'espaces de couleurs
    Voir les liens donnés sur les forums datant du 24/10/2016 et du 11/01/2017.

    On s'y était bien amusés.

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    On s'y était bien amusés.
    Certes, et je n'ai pas lâché l'affaire, un peu insatisfait de certains "couples" pas très esthétiques (magenta-vert par ex.)

    Du coup je me suis dit que plutôt que d'utiliser un cercle chromatique classique avec RVB opposés à CMJ, j'allais explorer la piste CIE L*a*b* et sa transformation sympathique (il parait) CIE LCh*.

    À suivre + tard, là j'ai des câbles réseau à traficoter...

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    PS: Dans ce que tu viens de donner, il manque simplement un signe de multiplication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | X |   | 2.7690 1.7518 1.1300 |   | R |
    | Y | = | 1.0000 4.5907 0.0601 | * | G |
    | Z |   | 0.0000 0.0565 5.5943 |   | B |
    Oublié de préciser qu'il n'est pas présent dans le bouquin, mais à force de voir des matrices et leurs utilisations, je me suis douté qu'il le fallait.


    Citation Envoyé par wiwaxia Voir le message
    Tu as bien tort de déprimer sur ce sujet: c'est un capharnaüm propre à dégoûter tout lecteur désireux d'y comprendre quelque chose.
    Tu as raison à au moins 200 % !

    Et même les sites qui ont l'air de faire office de référence me font m'arracher les cheveux, un exemple avec le calculateur de conversions de Bruce Lindbloom :
    je pars d'une valeur LCh* de 52 100 30°, soit un orange bien rouge et bien en couleur, ni sombre ni éclairci (les pinailleurs diront "si si ! T'es à 52 pour L", oui, mais ça c'est pour les faire parler, pi c'est pour des raisons historiques, pi l'ihm est créée avec un curseur à 72 alors deux coups de page down réglée à 10 et hop !, 52 -- un coup de plus et c'est 42 ) et que me donne le convertisseur de Bruce ?
    Nom : lch_noscale.png
Affichages : 348
Taille : 18,5 Ko

    C'est pas brillant pas glorieux au niveau des résultats RGB, échelonnés de 0 à 1,
    Bon, je coche Scale RGB pour passer à 0...255, mais c'est pas mieux :
    Nom : lch_scaled.png
Affichages : 335
Taille : 18,7 Ko

    Je lis partout si val > 255 then val = 255 et si val < 0 then val = 0 ce qui nous donnerait donc 255 0 45 et ça, c'est pas orange, c'est un rouge qui va bientôt virer au pourpre...
    À gauche l'attendu, à droite le résultat du calcul :
    Nom : patches-good_bad.png
Affichages : 348
Taille : 206 octets

    Je comprends mieux pourquoi je voyais des comportements farfelus en manipulant le curseur "h" de ma maquette.
    Conclusion ? Je me vois dans l'obligation de jeter tous les codes de Bruce...

    Un autre idée, un autre convertisseur (fiable !) ?
    Cadeau :
    Nom : CIELAB1976.jpg
Affichages : 395
Taille : 28,0 Ko

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 681
    Points : 10 698
    Points
    10 698
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Je lis partout si val > 255 then val = 255 et si val < 0 then val = 0
    le terme technique c'est clamp (<- lien)

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par foetus Voir le message
    le terme technique c'est clamp (<- lien)
    Ah très bien, merci , mes lignes de code seront moins moches, mais c'est pas ça qui va arranger mes affaires...

    EDIT :
    Je suis reparti sur le convertisseur ColorSpace de Pascal Getreuer, j'en ai déjà parlé, c'est bien foutu, mais la misère c'est de travailler en CIE LCh* car le cadeau que je vous ai donné est bien joli, mais faux, et archi-faux !
    Les couleurs (telles que nous les connaissons) sont considérablement influencées par les valeurs de L et de C, je m'en rends bien compte quand je déplace un trackbar point par point et que d'un coup (L à 74) le vert se transforme en bleu à L = 75 !
    In-gé-ra-ble !
    Et le joli dégradé du cadeau devrait être plein de trous pour correspondre à la réalité des calculs...

    Heureusement qu'on peut éditer, ça me permet de barrer les énooooooormes bêtises que je raconte des fois... On va dire que je réfléchis à haute voix,
    Solution trouvée 48 h plus tard.

    Il existe des couleurs impossibles, jetez un œil au dernier exemple de cette page, juste avant les "Settings", au milieu de la page environ : remarquable travail !
    Ah, si j'avais le même prog en C...

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 681
    Points : 10 698
    Points
    10 698
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Il existe des couleurs impossibles, jetez un œil au dernier exemple de cette page, juste avant les "Settings", au milieu de la page environ : remarquable travail !
    Ah, si j'avais le même prog en C...
    C'est du JavaScript et du HTML , c'est assez simple pour trouver les sources : disons 1 journée

    Et effectivement il y a une classe CSS qui s'appelle "cp-unconvertible-cie-color"

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est du JavaScript et du HTML , c'est assez simple pour trouver les sources : disons 1 journée
    pi pour les étudier il faut bien compter 3 semaines à temps plein, parce qu'il n'y a pas qu'un seul .js
    Citation Envoyé par foetus Voir le message
    Et effectivement il y a une classe CSS qui s'appelle "cp-unconvertible-cie-color"
    on doit pas avoir les mêmes sources, j'ai celles du .zip sous le bouton "download", il y a 7 .css et 25 .js, ouch ! Le genre de trucs qu'on développe et construit petit à petit, mais indémontable ensuite.

    Un exemple tout bête :
    Nom : sliders_LCh.png
Affichages : 339
Taille : 7,3 Ko

    Sur cette image des curseurs j'ai horreur de l'absence d'espace entre "rgb" et "(218, 139, 163), j'ai donc fait une recherche sur "rgb(" et je trouve cette chaîne deux fois, dans jquery-colorpickersliders/jquery.colorpickersliders.js :
    $return = "rgb(" + Math.round(tmpcolor.r) + "," + Math.round(tmpcolor.g) + "," + Math.round(tmpcolor.b) + ")";
    et dans libraries/tinycolor.js: "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")":

    Hé bien si je rajoute une espace à l'endroit qui va bien dans le premier fichier, le panneau du bas avec "rgb(218, 139, 163)" devient transparent, si je la mets dans le second fichier le panneau récupère sa couleur mais les 3 curseurs deviennent transparents, et si je modifie les deux fichiers, les 4 zones deviennent transparentes, alors qu'il ne s'agit que d'une bête string...

    Vais pas perdre mon temps là-dessus, d'autant plus que je ne connais pas JavaScript.

    Voili voilou,

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 681
    Points : 10 698
    Points
    10 698
    Par défaut
    Il faut utiliser Firebug intégré au navigateur

    Voici le morceau (pas forcément complet) qui traite le RGBA, HLSA et cielch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    function _bindEvents() {
        triggerelement.on('colorpickersliders.destroy', function() {
            destroyColorPicker();
        });
        triggerelement.on('colorpickersliders.reset', function() {
            resetColorPicker();
        });
        triggerelement.on('colorpickersliders.updateColor', function(e, newcolor) {
            updateColor(newcolor);
        });
        triggerelement.on('colorpickersliders.showPopup', function() {
            showPopup();
        });
        triggerelement.on('colorpickersliders.hidePopup', function() {
            hidePopup();
        });
        $(document).on("colorpickersliders.changeswatches", function() {
            _renderSwatches();
        });
        if (!settings.flat && !settings.disableautopopup) {
            if (typeof triggerelement.attr("tabindex") === "undefined") {
                triggerelement.attr("tabindex", -1);
            }
            if (settings.preventtouchkeyboardonshow) {
                $(triggerelement).prop("readonly", true);
                $(triggerelement).on("click", function(ev) {
                    if (container.data("justshown")) {
                        container.data("justshown", false);
                    } else {
                        $(triggerelement).prop("readonly", false);
                        ev.stopPropagation();
                    }
                });
            }
            if (!triggerelementisinput) {
                $(triggerelement).on("click", function(ev) {
                    showPopup();
                    ev.stopPropagation();
                });
                $(document).on("click", function() {
                    hidePopup();
                });
            }
            $(triggerelement).on("focus", function(ev) {
                showPopup();
                ev.stopPropagation();
            });
            $(triggerelement).on("blur", function(ev) {
                hidePopup();
                if (settings.preventtouchkeyboardonshow) {
                    $(triggerelement).prop("readonly", true);
                }
                ev.stopPropagation();
            });
            container.on("touchstart mousedown", function(ev) {
                ev.preventDefault();
                ev.stopPropagation();
                return false;
            });
        }
        container.on("contextmenu", function(ev) {
            ev.preventDefault();
            return false;
        });
        elements.swatches.on("click", "li span", function(ev) {
            var color = $(this).css("background-color");
            updateColor(color);
            ev.preventDefault();
        });
        elements.swatches_add.on("click", function(ev) {
            _addCurrentColorToSwatches();
            ev.preventDefault();
        });
        elements.swatches_remove.on("click", function(ev) {
            _removeActualColorFromSwatches();
            ev.preventDefault();
        });
        elements.swatches_reset.on("click", function(ev) {
            _resetSwatches();
            ev.preventDefault();
        });
        elements.sliders.hue.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "hue";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('hsla', 'h', 3.6 * percent);
            _updateAllElements();
        });
        elements.sliders.saturation.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "saturation";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('hsla', 's', percent / 100);
            _updateAllElements();
        });
        elements.sliders.lightness.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "lightness";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('hsla', 'l', percent / 100);
            _updateAllElements();
        });
        elements.sliders.opacity.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "opacity";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('hsla', 'a', percent / 100);
            _updateAllElements();
        });
        elements.sliders.red.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "red";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('rgba', 'r', 2.55 * percent);
            _updateAllElements();
        });
        elements.sliders.green.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "green";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('rgba', 'g', 2.55 * percent);
            _updateAllElements();
        });
        elements.sliders.blue.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "blue";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('rgba', 'b', 2.55 * percent);
            _updateAllElements();
        });
        elements.sliders.cielightness.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "cielightness";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('cielch', 'l', (MAXLIGHT / 100) * percent);
            _updateAllElements();
        });
        elements.sliders.ciechroma.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "ciechroma";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('cielch', 'c', (MAXVALIDCHROMA / 100) * percent);
            _updateAllElements();
        });
        elements.sliders.ciehue.parent().on("touchstart mousedown", function(ev) {
            ev.preventDefault();
            if (ev.which > 1) {
                return;
            }
            dragTarget = "ciehue";
            var percent = _updateMarkerPosition(dragTarget, ev);
            _updateColorsProperty('cielch', 'h', 3.6 * percent);
            _updateAllElements();
        });
        elements.sliders.preview.on("click", function() {
            this.select();
        });
        $(document).on("touchmove mousemove", function(ev) {
            if (!dragTarget) {
                return;
            }
            var percent = _updateMarkerPosition(dragTarget, ev);
            switch (dragTarget) {
                case "hue":
                    _updateColorsProperty('hsla', 'h', 3.6 * percent);
                    break;
                case "saturation":
                    _updateColorsProperty('hsla', 's', percent / 100);
                    break;
                case "lightness":
                    _updateColorsProperty('hsla', 'l', percent / 100);
                    break;
                case "opacity":
                    _updateColorsProperty('hsla', 'a', percent / 100);
                    break;
                case "red":
                    _updateColorsProperty('rgba', 'r', 2.55 * percent);
                    break;
                case "green":
                    _updateColorsProperty('rgba', 'g', 2.55 * percent);
                    break;
                case "blue":
                    _updateColorsProperty('rgba', 'b', 2.55 * percent);
                    break;
                case "cielightness":
                    _updateColorsProperty('cielch', 'l', (MAXLIGHT / 100) * percent);
                    break;
                case "ciechroma":
                    _updateColorsProperty('cielch', 'c', (MAXVALIDCHROMA / 100) * percent);
                    break;
                case "ciehue":
                    _updateColorsProperty('cielch', 'h', 3.6 * percent);
                    break;
            }
            _updateAllElements();
            ev.preventDefault();
        });
        $(document).on("touchend mouseup", function(ev) {
            if (ev.which > 1) {
                return;
            }
            if (dragTarget) {
                dragTarget = false;
                ev.preventDefault();
            }
        });
        if (elements.connectedinput) {
            elements.connectedinput.on('keyup change', function() {
                var $input = $(this);
                updateColor($input.val(), true);
            });
        }
    }
     
    function _parseCustomSwatches() {
        swatches = [];
        for (var i = 0; i < settings.swatches.length; i++) {
            var color = tinycolor(settings.swatches[i]);
            if (color.format) {
                swatches.push(color.toRgbString());
            }
        }
    }
     
    function _renderSwatches() {
        if (!settings.swatches) {
            return;
        }
        if (settings.customswatches) {
            var customswatches = false;
            try {
                customswatches = JSON.parse(localStorage.getItem("swatches-" + settings.customswatches));
            } catch (err) {}
            if (customswatches) {
                swatches = customswatches;
            } else {
                _parseCustomSwatches();
            }
        } else {
            _parseCustomSwatches();
        }
        if (swatches instanceof Array) {
            elements.swatches.html("");
            for (var i = 0; i < swatches.length; i++) {
                var color = tinycolor(swatches[i]);
                if (color.format) {
                    elements.swatches.append($("<li></li>").append($("<span></span>").css("background-color", color.toRgbString())));
                }
            }
        }
        _findActualColorsSwatch();
    }
     
    function _findActualColorsSwatch() {
        var found = false;
        $("span", elements.swatches).filter(function() {
            var swatchcolor = $(this).css('background-color');
            swatchcolor = tinycolor(swatchcolor);
            swatchcolor.alpha = Math.round(swatchcolor.alpha * 100) / 100;
            if (swatchcolor.toRgbString() === color.tiny.toRgbString()) {
                found = true;
                var currentswatch = $(this).parent();
                if (!currentswatch.is(elements.actualswatch)) {
                    if (elements.actualswatch) {
                        elements.actualswatch.removeClass("actual");
                    }
                    elements.actualswatch = currentswatch;
                    currentswatch.addClass("actual");
                }
            }
        });
        if (!found) {
            if (elements.actualswatch) {
                elements.actualswatch.removeClass("actual");
                elements.actualswatch = false;
            }
        }
        if (elements.actualswatch) {
            elements.swatches_add.prop("disabled", true);
            elements.swatches_remove.prop("disabled", false);
        } else {
            elements.swatches_add.prop("disabled", false);
            elements.swatches_remove.prop("disabled", true);
        }
    }
     
    function _storeSwatches() {
        localStorage.setItem("swatches-" + settings.customswatches, JSON.stringify(swatches));
    }
     
    function _addCurrentColorToSwatches() {
        swatches.unshift(color.tiny.toRgbString());
        _storeSwatches();
        $(document).trigger("colorpickersliders.changeswatches");
    }
     
    function _removeActualColorFromSwatches() {
        var index = swatches.indexOf(color.tiny.toRgbString());
        if (index !== -1) {
            swatches.splice(index, 1);
            _storeSwatches();
            $(document).trigger("colorpickersliders.changeswatches");
        }
    }
     
    function _resetSwatches() {
        if (confirm("Do you really want to reset the swatches? All customizations will be lost!")) {
            _parseCustomSwatches();
            _storeSwatches();
            $(document).trigger("colorpickersliders.changeswatches");
        }
    }
     
    function _updateColorsProperty(format, property, value) {
        switch (format) {
            case 'hsla':
                color.hsla[property] = value;
                color.tiny = tinycolor({
                    h: color.hsla.h,
                    s: color.hsla.s,
                    l: color.hsla.l,
                    a: color.hsla.a
                });
                color.rgba = color.tiny.toRgb();
                color.cielch = $.fn.ColorPickerSliders.rgb2lch(color.rgba);
                container.removeClass("cp-unconvertible-cie-color");
                break;
            case 'rgba':
                color.rgba[property] = value;
                color.tiny = tinycolor({
                    r: color.rgba.r,
                    g: color.rgba.g,
                    b: color.rgba.b,
                    a: color.hsla.a
                });
                color.hsla = color.tiny.toHsl();
                color.cielch = $.fn.ColorPickerSliders.rgb2lch(color.rgba);
                container.removeClass("cp-unconvertible-cie-color");
                break;
            case 'cielch':
                color.cielch[property] = value;
                color.rgba = $.fn.ColorPickerSliders.lch2rgb(color.cielch);
                color.tiny = tinycolor(color.rgba);
                color.hsla = color.tiny.toHsl();
                if (settings.erroneousciecolormarkers) {
                    if (color.rgba.isok) {
                        container.removeClass("cp-unconvertible-cie-color");
                    } else {
                        container.addClass("cp-unconvertible-cie-color");
                    }
                }
                break;
        }
    }

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il faut utiliser Firebug intégré au navigateur
    Vi, mais j'ai qu'un écran ! (mais comment on faisait quand c'étaient des 14" !)

    Citation Envoyé par foetus Voir le message
    Voici le morceau (pas forcément complet) qui traite le RGBA, HLSA et cielch
    Au secours !...

    Tiens, avec mon Pascal, en pompant un bout de VB.net ici, du C ailleurs, un peu de javascript et je sais plus quoi d'autre, j'arrive à un résultat :
    Nom : rgb_lch.png
Affichages : 343
Taille : 6,2 Ko

    À gauche c'est du rgb pur et dur pondu il y a quelques mois, à droite du lch d'il y a une demi-heure : faudra creuser le fait que C est à 50 et du coup, couleurs un peu fadasses...

    L'intérêt de l'affaire (pour moi), c'est que si je convertis cette image en niveaux de gris basés sur la luminosité, ça donne ça :
    Nom : rgb_lch_gris.png
Affichages : 335
Taille : 4,6 Ko

    où l'on voit que l'« énergie » des couleurs est bien uniforme à droite.

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Bon voilà,
    il me manquait juste le "clamping" (merci foetus d'avoir mis le doigt là où ça faisait mal ) des valeurs RGB générées par les calculs... Je suis reparti du calculateur d'EasyRGB, qui a la bonne idée de présenter d'une manière bien lisible et très parlante les valeurs calculées.

    Et donc, partant d'une couleur bien précise, que plusieurs calculateurs me sortaient avec les mêmes valeurs, à gauche le calculateur de colormine.org, pas très ergonomique, et après le download on se retrouve face à une cinquantaine de fichiers (c'est du C sharp), à droite mes essais un peu (beaucoup !) en vrac...
    Nom : compar_prog_colormine.jpg
Affichages : 394
Taille : 38,3 Ko

    Mais heureusement, EasyRGB m'a apporté la lumière :
    Nom : easyrgb.png
Affichages : 393
Taille : 77,3 Ko

    J'ai retravaillé en 20 minutes ses formules vers mon Lazarus et voilà un dégradé magnifique,
    Nom : lch_ok.jpg
Affichages : 341
Taille : 8,5 Ko
    sans trous ni sautes de couleurs, tout est bon et tout est bien qui finit bien,

    Prochaine étape, un cercle chromatique basé sur CIE-LCh*

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. [Image] [JAI] conversion d'espaces de couleur
    Par Patriarch24 dans le forum Graphisme
    Réponses: 2
    Dernier message: 25/08/2010, 18h01
  2. Conversion d'espace dans chaine
    Par Shifty_ dans le forum C#
    Réponses: 8
    Dernier message: 06/03/2007, 15h22
  3. problème de matrice
    Par micfont999 dans le forum C++
    Réponses: 9
    Dernier message: 07/01/2007, 16h19
  4. Réponses: 3
    Dernier message: 28/12/2006, 16h06
  5. Problème de chemin de fichier avec des espaces
    Par Akronyme dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 11/12/2006, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo