Question

Je crée une galerie régulière dans ASP.NET, mais j'ai peu d'expériences avec la création de vignettes. Je sais que les algorithmes et la méthode GetThumbnailImage, mais mon problème est ailleurs - j'affiche actuellement les images (juste redimensionné) en utilisant le contrôle ImageButton. Et c'est le point - Je ne sais pas comment raccorder l'image « thumbnailed » à la propriété ImageUrl. Est-il même possible et si oui, comment? Ou devrais-je utiliser un autre contrôle à la place? Merci pour toutes suggestions!

Était-ce utile?

La solution

Vous pouvez créer une HttpHandler qui gère les demandes d'images et retourne les vignettes (ou fait tout ce dont vous avez besoin sur les images).

Chaque fois que vous faites des trucs graphiques dans ASP.NET, gardez à l'esprit que presque tous de System.Drawing est une enveloppe pour GDI + et thetrefore contient des références à la mémoire non managée qui doit être correctement placé (utilisation la déclaration de using). Cela est vrai même pour les classes simples comme StringFormat etc.

Autres conseils

On dirait que vous avez besoin de mettre en place un HttpHandler, qui créeraient l'image redimensionnée et cache probablement sur le disque et, pour éviter de devoir recréer la vignette sur chaque demande.

Ainsi, par exemple:

<asp:ImageButton ID="ImageButton1" ImageUrl="~/ImageHandler.ashx?ImageId=123" runat="server />

Vous auriez alors un gestionnaire:

namespace MyProject
{
    public class ImageHandler : IHttpHandler
    {
        public virtual void ProcessRequest(HttpContext context)
        {
            // 1. Get querystring parameter
            // 2. Check if resized image is in cache
            // 3. If not, create it and cache to disk
            // 5. Send the image

            // Example Below
            // -------------

            // Get ID from querystring
            string id = context.Request.QueryString.Get("ImageId");

            // Construct path to cached thumbnail file
            string path = context.Server.MapPath("~/ImageCache/" + id + ".jpg");

            // Create the file if it doesn't exist already
            if (!File.Exists(path))
                CreateThumbnailImage(id);

            // Set content-type, content-length, etc headers

            // Send the file
            Response.TransmitFile(path);
        }

        public virtual bool IsReusable
        {
            get { return true; }
        }
    }
}

Vous auriez besoin aussi de mettre cela dans web.config

<system.web>
    <httpHandlers>
        <add verb="*" path="ImageHandler.ashx" type="MyProject.ImageHandler, MyProject"/>
    </httpHandlers>
</system.web>

Cela devrait être suffisant pour vous aider à démarrer. Vous aurez besoin de modifier la méthode de ProcessRequest pour créer la vignette, mais vous avez mentionné avoir pris en charge déjà. Vous devez également vous assurer que vous définissez les en-têtes correctement lors de la transmission du fichier au navigateur.

Http Handler est la voie à suivre.

Une autre note sur la performance: la manipulation des images est coûteuse par rapport à l'espace disque, aussi bien du point de vue de la mémoire et cpu. Par conséquent générer la vignette d'une image complète est quelque chose que vous voulez seulement faire une fois pour chaque image complète. Le meilleur moment pour le faire est probablement au moment où l'image est téléchargée, surtout si vous montrerez un certain nombre de ceux-ci sur la même page.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top