GDI+ et ASP.Net : la génération d'imagesDate de publication : 18/05/2005
Par
Ronald VASSEUR (autres articles) Introduction 1. Génération d'une image contenant du texte 1.1. Image sauvegardée sur le disque dur 1.2. Transfert direct de l'image de la mémoire à la page ASPX 1.3. Le rendu des textes 2. Différents pinceaux proposés par GDI+ 2.1. SolidBrush 2.2. Linear et Path Gradient Brush 2.3. HatchBrush 2.4. TextureBrush 3. Génération d'une image contenant un texte aléatoire 3.1. La méthode 3.2. Le code commenté Conclusion Ressources Introduction
La génération d'images peut avoir bien des applications. L'une des plus connues est certainement
le fait de les utiliser pour sécuriser le remplissage d'un formulaire, ainsi cela permet
d'empêcher l'automatisation de ce processus par des robots logiciel. Dans cet article, nous verrons
comment générer des images grâce au Framework, avec un aperçu des possibilités offertes.
1. Génération d'une image contenant du texte
Nous allons, dans un premier temps, voir comment générer des images grâce à GDI+ et
l'ASP.Net. Il s'agira d'une image simple contenant du texte. Nous allons utiliser,
pour cela, un ensemble de classes fournies par le Framework. Ces classes sont
contenues dans l'espace de noms System.Drawing et System.Drawing.Imaging.
1.1. Image sauvegardée sur le disque dur
Pour générer une image, plusieurs étapes sont nécessaires, et il y a un certain
nombre d'objets à instancier. Cela reste simple, et surtout logique, donc pas d'inquiétude !
Voici le code complet permettant de générer une image et de l'enregistrer sur le disque dur du serveur.
Quelques explications :
Objet Bitmap : Il s'agit, en quelque sorte, d'un conteneur dans lequel nous placerons notre image. Nous passons au constructeur les dimensions en pixels de celui-ci; en premier la largueur, puis la hauteur. Il existe une douzaine de surcharges différentes, mais ici nous avions seulement besoin de spécifier la taille de notre Bitmap. Objet Graphics : L'objet Graphics va être notre surface de dessin. La classe Graphics fournit, entre autre, des méthodes pour dessiner des formes (rectangles, lignes ). Nous allons créer un objet Graphics en lui passant en paramètre notre objet Bitmap instancié à l'étape précédente. Objets Brush : Nous avons créé des instances d'objets nous permettant de "dessiner" notre image. Nous utilisons deux objets " pinceaux ", un pour colorer le fond de notre image, puis un autre pour écrire (ou plutôt dessiner) le texte par-dessus. Méthode FillRectangle (classe Graphics) : Cette méthode crée un rectangle à partir du point 0,0 sur la totalité de notre surface de dessin, qui je le rappelle fait 700 x 100 pixels. Méthode DrawString (classe Graphics) : La méthode DrawString permet de dessiner une chaîne de caractères sur un objet Graphics. Cette méthode admet plusieurs surcharges, ce qui nous offre diverses possibilités. Méthode Save (classe Bitmap) : La méthode Save permet d'enregistrer notre image dans un fichier, et cela au format que l'on souhaite. Les principaux formats supportés sont : Bmp, Gif, Icon, Jpeg, Png et Tiff. On passe à cette méthode en premier le chemin de stockage, puis le format du fichier à enregistrer.
1.2. Transfert direct de l'image de la mémoire à la page ASPX
Le fait d'enregistrer une image sur le disque dur, après l'avoir générée,
peut, selon les cas, être une opération inutile, lente, et consommatrice
de ressources. Donc si l'enregistrement sur le disque de cette image n'est
pas indispensable, vous pouvez l'envoyer directement vers le client,
depuis la mémoire. Pour cela, il suffit simplement de modifier la dernière
étape de notre génération. Plus précisément, au lieu d'enregistrer l'image
avec le code suivant :
Il faut l'envoyer au client avec ce code :
Comme vous pouvez le voir ce n'est vraiment pas sorcier !
1.3. Le rendu des textes
Le rendu du texte va faire que votre image sera de bonne
qualité, ou de moins bonne, mais avec un volume moins
important. Il existe 6 rendus différents proposés par le Framework, ces
6 rendus sont spécifiques au texte contenu dans une image. Tout cela est
intégré dans l'espace de noms System.Drawing.Text . Pour le rendu de
l'image, ici nous ne l'étudierons pas (notre image présentant un fond uni
),
il faut utiliser QualityMode se trouvant dans l'espace de noms
System.Drawing.Drawing2D .
Voici la présentation de ces rendus, leur description est issue du MSDN :
Vous trouverez en bas de page le lien relatif à cette documentation.
Pour appliquer le rendu à notre texte, se trouvant sur notre surface monGraphic,
il faut procéder de la manière suivante :
Voilà, rien de bien complexe, une fois de plus, tout est pris en charge par le Framework.
2. Différents pinceaux proposés par GDI+2.1. SolidBrush
Il s'agit du pinceau "de base" qui permet de remplir des formes, telles que les
carrés, rectangles, ellipses
avec une couleur unie. Cette classe se trouve dans
le namespace System.Drawing, et comme tous les autres pinceaux, elle hérite de
la classe Brush.
2.2. Linear et Path Gradient Brush
LinearGradientBrush : c'est un pinceau permettant de faire un dégradé linéaire de
couleurs. Il est possible d'employer deux ou plusieurs couleurs et, également,
de choisir le mode de mélange des couleurs grâce à des méthodes spécifiques.
Ainsi, les résultats possibles sont très nombreux.
PathGradientBrush : ce pinceau permet aussi de réaliser des dégradés linéaires de couleurs, mais son fonctionnement est un peu plus complexe que le précédent. Il permet notamment de créer des dégradés de couleurs partant du centre de l'image. 2.3. HatchBrush
Ce pinceau permet de définir un "hachurage" de l'image avec une couleur de premier et
d'arrière plan. L'hachurage de l'image est contenu dans la propriété HachStyle, il
en existe une multitude. Je vous renvoie au MSDN pour de plus amples informations.
2.4. TextureBrush
Ce pinceau est un peu différent dans le sens où il utilise un fichier image
pour remplir la surface concernée. Il permet donc d'utiliser des textures
existantes.
Voilà pour ce tour rapide des principaux types de pinceaux. Ils possèdent
tous de nombreuses méthodes et propriétés permettant d'obtenir un résultat
très fin, il ne faut donc pas hésiter à se rapporter à leur documentation.
3. Génération d'une image contenant un texte aléatoire3.1. La méthode
Nous allons ici créer une image de manière aléatoire, cela signifie que le texte
qu'elle va contenir sera écrit aléatoirement, de manière à ce qu'il
ne soit pas possible de prédire quel sera ce texte. En plus, nous
allons définir, de manière aléatoire, quelle sera la couleur du fond.
Il serait possible d'avoir un fond non uni, présentant une surface
irrégulière, mais ce n'est pas ici le sujet. Nous nous contenterons
d'un texte aléatoire sur fond uni. Mais il est important de préciser,
que sans grande difficulté, il serait possible d'avoir un texte de
taille et de casse variable, ce qui pourrait être un gage de sécurité
supplémentaire face aux "robots logiciels" qui parfois arrivent à
"lire" les images contenues dans les processus d'inscription sur les
forums, ou autres.
Notre façon de procéder va être très simple, et ne va rien inventer. Nous
allons simplement nous appuyer sur le Framework et sa classe Random qui
offre des méthodes pour obtenir des chiffres de manière aléatoire.
Tout d'abord, nous allons instancier un objet Random, puis avec sa
méthode Next nous allons déterminer la couleur du fond. Ensuite nous
allons procéder de même pour composer la chaîne de caractères à partir
d'un tableau contenant les 26 lettres de l'alphabet, ainsi que les
chiffres 1 à 9. La classe Random s'appuyant sur une valeur initiale
pour générer des nombres, nous utiliserons une valeur relative au
temps pour changer ainsi le mode de génération à chaque affichage
d'une image. Ainsi, à chaque instanciation de la classe Random,
nous lui passerons "DateTime.Now.Millisecond" qui retourne un entier.
Rien ne sert de détailler plus les explications, la lecture du code
commenté vous permettra de voir, précisément, quelle est la façon de procéder.
3.2. Le code commenté
Conclusion
J'espère qu'au travers de ce tour d'horizon rapide de GDI+ avec ASP.Net,
vous aurez pu entrevoir les possibilités qui s'offrent à vous ! En quelques
lignes de codes, nous avons pu générer des images (certes basiques, mais des images
quand même ! ). Une fois de plus le Framework nous a fourni les briques
essentielles, sans que l'on ait à ré-inventer la roue ! En espérant vous
avoir intéressé, je vous donne rendez vous dans un prochain tutoriel.
Ressources
|
Copyright © 2004 Ronald VASSEUR. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.