dimanche 11 décembre 2011

07# Extension pour MSpaint sur windows XP

MIS A JOUR, téléchargement

Description | Instructions | Téléchargement
*Les ancres HTML ne semblent pas marcher ... :(

Description:
Comme je vous en avais parlé, j'ai travaillé sur un petit projet cette semaine, qui pouvait me permettre d'augmenter les possibilités de Paint. Les outils que j'ai rajouté permettent principalement de peindre en faisant des dégradés, et reconnaissent la pression du stylet. Ça dénature un peu Paint, mais c'était assez marrant à faire.

Ce programme est donc tout à fait à part et externe à Paint.
     





Démarche:
Pour commencer, j'ai essayé de retrouver l'adresse en mémoire des variables concernant les éléments dont j'avais besoin (taille du pinceau, couleur courante, etc ...) grâce à CheatEngine. Il a fallu ensuite vérifier que ces variables restaient aux mêmes emplacements d'une éxécution à l'autre, et sur différentes machines. C'est bien le cas de la version de Paint pour windows XP, mais pas de celle pour Seven (donc on peut rien faire pour lui). J'ai pas eu l'occasion de tester sur Vista.
A partir de là, j'ai du me documenter un peu sur l'API Windows pour parvenir à accéder aux variables d'un autre programme depuis le mien, connaissant seulement leur adresse.
Une fois cette étape réeussie, j'avais le contrôle sur la taille du pinceau depuis mon programme. Alors j'ai commencé par implémenter le plus important: la reconnaissance de la pression du stylet. Après plusieurs heures de recherches peu fructueuses, je suis finalement tombé sur bbTablet, une bibliothèque C++ basée sur WinTab et permettant de supporter et de récupérer des informations sur les tablettes Wacom.
La partie la plus longue était faite.
Puis je me suis mis à toucher à la couleur. En voulant récupérer la couleur dans la variable correspondante, je me suis rendu compte d'un problème: je recevais un nombre entier avec une valeur aberrante (16 000 000, pour du blanc, par exemple), alors que j'avais besoin des habituelles valeurs RGB pour pouvoir les modifier correctement. Après de nombreux tests je me suis rendu compte, un peu au hasard, que si on apelle le nombre entier incompréhensible "Color", on a:


Color = R + V*256 + B*256²

________________________________________________________________________________________ 
Mais dans mon cas, j'avais Color, et je cherchais R, V et B. Soit une équation avec trois inconnues, que je ne savais pas résoudre. Alors, j'ai cherché à tatons, et j'ai fini par trouver (je ne comprends d'ailleurs pas comment, alors si quelqu'un pouvait m'expliquer ... ):

B = Color / 256²
V = (Color-B*256²)/256
R = Color - B*256² - V*256 

Ça paraît tout à fait illogique, et pourtant ça fonctionne dans tous les cas...
________________________________________________________________________________________

Merci Evarin :D
J'ai donc finalement:
B=(Color>>16);
V=(Color>>8)&0xFF; 
R=(Color)&0xFF;

C'est vrai que c'est plus joli...
Une fois ça acquis, j'ai fait en sorte que le dégradé s'applique sur la couleur courante, selon la pression, et entre les couleurs 2 et 3 (séléctionnables dans Paint en faisant clic droit, et Ctrl + clic gauche dans le nuancier)

Enfin, pour éviter d'avoir une fenêtre encombrante en même temps que l'utilisateur dessine, j'ai ajouté un KeyHooker, en gros, un écouteur sur le clavier qui permet d'intercepter les touches frappées mêmes si vous n'avez pas le focus sur mon programme - c'est parfois utilisé dans certains virus. Mais pas de panique: il est plutôt bas niveau, puisqu'il n'écoute que l'appui sur la touche "Entrée", pour choisir d'afficher / cacher la fenêtre de contrôle de mon programme depuis Paint. De plus, il est fait grâce à une simple fonction de l'API Windows: GetKeyState().
Je vous le dis, vous pouvez avoir confiance, mon code est clean, et vous avez accès à la source (voir téléchargements) si vous voulez en savoir un peu plus.
Pour l'instant, l'extension ne permet rien de plus, mais c'était déja un gros défi, et le plus dur est derrière moi.
...

Instructions:
             • Evitez de sélectionner une couleur par clic gauche comme il est d'usage sur paint: ça ne sert plus à rien.
             • Sélectionnez la couleur 2 par un clic droit sur le nuancier. C'est la couleur d'arrivée du dégradé (la plus présente quand la pression est la plus forte).
             • Sélectionnez la couleur 3 en faisant Ctrl+Clic sur le nuancier. C'est la couleur de départ du dégradé. (la plus présente avec la pression la plus faible).

             • Entrée pour afficher / cacher la boîte à outils
             • Flèche du haut/bas pour augmenter/baisser la taille maximale du pinceau
             • Lancez PaintXP pressure.exe APRES avoir lancé paint.
             • Vous pouvez toujours utiliser Paint sans l'extension. Le programme ne modifie rien.
             • Le programme-extension ne se ferme pas en même temps que paint (enter pour l'afficher et le fermer
             • L'extension ne supporte:  _ que les tablettes Wacom
                                                       _ que les versions Xp de Paint
               Toutefois elle peut être utilisée sur d'autre systèmes d'exploitation si c'est toujours la version Xp de paint (déja testé sur windows seven). Je ne me suis pas préoccupé de Windows 98 et avant :D
             • Je ne garantis pas pour autant que ça fonctionne sur toutes les configurations

Voilà, j'avais la flemme de faire une jolie boîte à outil alors forcémment c'est moins ergonomique, mais si quelqu'un veut reprendre le projet ...
 
Téléchargement:


                           Executable simple

                           Source (projet Code::Blocks) (C++)


                           Télécharger MSPaint version Xp


----------------------------------------------
Cette application est tout à fait inutile, et je suppose que ça ne vous servira pas beaucoup en pratique mais j'aimerais bien entendre vos retours. Et désolé pour ceux qui sont sur mac ou sous Unix.
* J'ai fini par bacler ce projet sur la fin désolé,  mais je ne l'améliorerais plus à priori

13 commentaires:

  1. Wow, bravo ^^. Impressionnant. Enfin, je suis sous seven avec une tablette qui n'est pas wacom, je peux pas tester :p...
    Pour la couleur : R, V et B sont des variables allant chacune de 0 à 255. Chaque couleur est donc codée sur 8 bits, ce qui, mis à la suite, fait un chiffre sur 24 bits (16 millions et des poussières). Et "décaler" de 8 bits revient à multiplier/diviser par 256.
    Pour retrouver chacune de ces composantes, il faut regarder juste le n-ième octet.
    Un peu plus propre : B=(color>>16); V=(color>>8)&0xFF; R=(color)&0xFF;
    Ça fait exactement la même chose (>> correspond au décalage de _ bits vers la droite, et & (opérateur AND) permet de ne considérer que les bits qui nous intéressent, l'équivalent du (-B*256²-V*256)). Sauf que c'est beaucoup plus simple à calculer pour l'ordi ^^. Et un peu plus propre...

    RépondreSupprimer
  2. J'avais aucune idée qu'on pouvait manipuler les bits.
    En fait j'avais même pas fait de rapprochement avec ...
    Une fois encore, merci beaucoup ! :)

    RépondreSupprimer
  3. Très sympa l'explication de ta démarche !

    RépondreSupprimer
  4. Arg! je viens de découvrir ton nouveau blog ! C'est méga coolos!
    (moi qui me désespérais de passer sur ton ancien et de plus rien voir de nouveau^^')
    Bon faut que je vois tout ce que t'as fait depuis alors... :)

    RépondreSupprimer
  5. Les gens ne regardent que les images ... :(

    RépondreSupprimer
  6. Non Layl, ils ne regardent pas uniquement les images.

    RépondreSupprimer
  7. monsieur blanchard16 décembre 2011 à 18:48

    tiens, pour ton devoir de français absent, regarde
    http://books.google.fr/books?id=8dSeVDpOxr4C&hl=fr&source=gbs_slider_gbs_user_shelves_1006_homepage

    RépondreSupprimer
  8. Réponses
    1. quand j'essaie d'ouvrir tes documents à la fin avec winrar, ça s'ouvre avec Papercraft 3 que mon frère a téléchargé récemment. Ca pue duc

      Par contre, je suis impressioné par ton boulot. Je pensais pas que tu pouvais faire ça, bravo!

      Supprimer
    2. Merci :D

      Pour ouvrir, j'imagine que tu peux faire: clic droit > ouvrir avec ... > Winrar, ou QuickZip, ou autre ..... Enfin, ton décompresseur favori

      Supprimer