Dessiner en Python
Par Mathieu Lecarme le dimanche, 11 avril 2004, 21:04 - Lien permanent
Pour génerer des images, PHP et son GD montre vite ses limites. Et pour generer du dessin vectoriel, c'est encore plus flagrant. Dans ce cas, un vrai langage comme Python est nettement plus adéquat.
Bitmap
PIL est un grand classique de Python. Cette bibliothèque permet simplement de manipuler des images. Parmi les jouets fournis, on trouve les typo via freetype, les couches alphas, la gestion des couleurs en RGB, HSV et CMYK, des primitives de dessins, les compositions, les scanners avec SANE ... PIL est packagé sur Linux et MacOSX (avec MacPython), et un instaleur est fourni pour Windows.
Vectoriel
Il est simple de composer des images bitmap avec des fonctions proches des claques de photoshop. Pour générer du vectoriel, tout ce complique. La tentation est de générer du SVG, dans le texte. Mais ce n'est pas très pratique. Reportlab apporte une solution élégante. L'image est composée de primitives (carré,rond,trait...) qui subissent de transformations (translation, rotation, échelle...), et ensuite, cette composition est moulinée pour produire un PDF, un SVG ou un bitmap. La souplesse vient de la possibilité de créer ses propres objets avec leurs propriétés. La composition devenant un assemblage d'objets avec différentes propriétés.
Ces objets sont très simples à créer, ils dérivent de la class Widget et doivent avoir une méthode draw qui renvoie un Group contenant une image.
[python] class Triangle(Widget): def __init__(self): self.x = 0 self.y = 0 self.angle = 0 def draw(self): g = Group() g.transform = [1,0,0,1,self.x,self.y] l = PolyLine([-25,-50,0,50,25,-50,-25,-50]) l.strokeWidth = 10 l.strokeColor = colors.black l.strokeLineJoin = 1 g.add(l) g.rotate(self.angle) return g
Ici, les propriétés sont une position (x,y) et un angle. Rien de compliqué. La seule chose bizarre est l'utilisation de coordonnées directes, avec l'origine en bas à gauche, alors qu'en informatique, le zéro est traditionnellement en haut à gauche, et le x croissant descend. Pour mettre en pratique tout ça, voici un petit test de création de point de croix. À partir d'une image aux nombres de couleurs limitées, une grille est créée, avec un picto par couleur pour la tradition, et la couleur de fonds pour voir quelque chose. Lapin au point de croix
L'algorithme est tout simple, un premier passage sur l'image pour énumérer les couleurs. À chaque couleur est arbitrairement attribué un picto. Re passage de l'image et création de la grille au fur et à mesure. La prochaine étape est le choix des couleurs se rapprochant des fils existants. Ensuite, une interface, les brodeuses, n'aime pas forcément la ligne de commande.

