jeudi 7 juin 2012

26# color picker

C'est pas grand chose, mais j'ai programmé un selecteur de couleur, pour me perfectionner avec Qt, et dont je vais me servir pour la fenêtre servant à parametrer l'extension pour paint. Ce projet avance lentement mais je m'y plonge pas vraiment; et les Bacs approchent virgule point.


un bref aperçu du code, peu représentatif de ce que c'est mais toujours bon pour la frime.

painter:



La principale difficulté est de générer le dégradés soi-même, de façon dynamique pour que ça soit indépendant de la taille allouée à la fenêtre l'affichant, tout en représentant toutes les couleurs du spectre. J'ai d'abord hésité sur la forme du selecteur, et j'ai finalement opté pour un color picker façon photoshop, simple mais efficace, et beaucoup plus facile à mettre en place qu'un autre, façon Painter par exemple:





Photoshop


paint (de base windows)


Tous ces selecteurs sont séparés en deux parties mais proposent des approches différentes.

• Dans le selecteur utilisé par paint, on a une partie pour choisir à la fois la teinte et la saturation , et une autre pour choisir la luminosité de la couleur. La teinte évolue en même temps que l'on avance sur l'axe des abcisses; la saturation baisse en proportion lorsque l'on descend le long de l'axe des ordonnées. De même pour la luminosité.  Celui ci aurait été plutôt simple à faire, mais je le trouve particulièrement peu ergonomique.

• Pour photoshop, ou dans mon selecteur, l'approche est plus intuitive à mon sens:
Un selecteur de teinte principal à droite, un selecteur de luminosité / saturation à gauche, ces valeurs évoluant en proportion sur les axes correspondant.

Le code correspondant pour générer le dégradé dans mon application:
(on calcule une couleur selon des coordonnées dans un espace en deux dimensions).

        for(x=0; x<width; x++)
        {
            for(y=0; y<height; y++)
            {
                H=current_hue;
                S=x/width*255.f;
                V=(height-y)/height*255.f;
                color = QColor::fromHsv(H,S,V);
                gradient_image.setPixel(x,y,color.rgb());
            }
        }

On peut voir ici que j'utilise l'espace colorimétrique HSV (Hue Saturation Value),
où S et V doivent varier entre 1 et 255.

•Enfin dans painter, je trouve que l'approche est la plus ergonomique. La teinte évolue dans un selecteur formé par un cercle. La valeur Hue doit varier entre 1 et 360, c'est donc particulièrement approprié, et j'aurais pu le faire mais ça demanderait un plus long temps de calcul pour générer le dégradé et j'ai pas encore assez d'experience pour optimiser efficacement mes applications Qt. Le selecteur de Saturation / Value (qui correspond en fait à la luminosité) est formé par un triangle plein, cette fois, et je n'y ai pas plus réfléchi que ça mais j'avoue que je ne saurais pas comment implémenter la génération de ce type de dégradé...


Pour conclure, si vous voulez profiter du selecteur de couleur de Painter tout en travaillant sur photoshop, il existe un plugin que j'utilise depuis longtemps, et ça se télécharge ici.
 Il fonctionne parfaitement sous CS4, mais j'ai jamais testé sous d'autres versions.



3 commentaires:

  1. C'est sympa ! J'avais fais ça il y a un certain temps, mais en sûrement moins compliqué puisque je ne voulais l'implanter nul part...
    Note qu'on peut aussi avoir un sélecteur à la Paint dans Photoshop (en cliquant sur le bouton radio à gauche de "L") :P
    Et aussi, juste un détail : que ce soit en HSV, en RGB ou autre, on mesure toujours chaque composante sur 256 niveaux : donc ça varie de 0 à 255 ! C'est ce que tu as fait dans ton code, donc pas de problème. De toute façon, ça n'aurait tué personne... pour un niveau...

    RépondreSupprimer
  2. Il est complètement inutile de réinventé la roue.
    https://qt-project.org/doc/qt-5.0/qcolordialog.html

    RépondreSupprimer
  3. Oui-sauf-que-ce-que-tu-me-montres-c'est-une-boîte-de-dialogue-donc-pas-intégrable-dans-une-mise-en-page-et-en-plus-c'est-moche-et-pas-ergonomique.

    RépondreSupprimer