Attention !

Ce site n'est plus maintenu. Retrouvez l'article sur Colorseeds.net

Vous allez être redirigé dans 5 secondes...

Vous êtes ici : Accueil > Blog technique > .NET : Générat

.NET : Génération d'une image à la volée
16/06/2010

Imaginons qu'on veuille afficher une image qui changerait d'aspect à chaque chargement de page (graphiques, clavier virtuel pour l'authentification...). Il ne serait pas pratique de stocker ces images temporaires côté serveur (il faudrait être sûr de donner un nom unique aux images pour éviter les conflits par exemple).

La solution qui suit permet d'éviter de stocker des images sur le serveur. On va créer une page ASPX qui retourne un flux de type MIME "image/***".

Dans la page qui affichera l'image générée, il faut une balise de la sorte :

<img src="GenerateurImage.aspx" alt="" />

La page
GenerateurImage.aspx ne contient rien (ou le minimum).
Tout se passe dans la procédure page_load du code-behind (
GenerateurImage.aspx.cs) :

                public void Page_Load(object sender, System.EventArgs e)
        {
           
           // On peut partir d'une bitmap existante, ou en générer une nouvelle :

           Bitmap oBit = new Bitmap(???);
           Graphics g =
Graphics.FromImage(oBit)

          
           // Ici on modifie l'image avec toutes les méthodes offertes par la classe Graphics.
           // On pourrait éventuellement utiliser des paramètres de la requête (ID=...)
pour rendre la chose encore plus dynamique !

            // On change le type de flux de sortie
            Response.ContentType = "image/jpeg";

            // On encode (compression)
            ImageCodecInfo myImageCodecInfo;
            Encoder myEncoder;
            EncoderParameter myEncoderParameter;
            EncoderParameters myEncoderParameters;

            myImageCodecInfo = GetEncoderInfo("image/jpeg");
            myEncoder = Encoder.Quality;

            myEncoderParameters = new EncoderParameters(1);

            // Niveau d'encodage élévé.
            myEncoderParameter = new EncoderParameter(myEncoder, 100L);
            myEncoderParameters.Param[0] = myEncoderParameter;
            oBit.Save(Response.OutputStream, myImageCodecInfo, myEncoderParameters);

           
oBit.Dispose();

            // Pas de cache pour cette page.
            Response.CacheControl = "no-cache";
            Response.AddHeader("Pragma", "no-cache");
            Response.Expires = -1;
        }



En bonus, la fonction qui ramène le codec :


        private static ImageCodecInfo GetEncoderInfo(String mimeType)
        {
            int j;
            ImageCodecInfo[] encoders;
            encoders = ImageCodecInfo.GetImageEncoders();
            for (j = 0; j < encoders.Length; ++j)
            {
                if (encoders[j].MimeType == mimeType)
                    return encoders[j];
            }
            return null;
        }

Ajouter un commentaire

Auteur


Email


Message *