2010-05-07 26 views
1

Je reçois les données de l'image stockée sur la base de données comme byte [] array; puis je le convertis en System.Drawing.Image comme le code ci-dessous;Une image de l'octet à la présentation de page Web optimisée

public System.Drawing.Image CreateImage(byte[] bytes) 
     { 

      System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bytes); 
      System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream); 
      return image; 
     } 

(*) D'autre part, je me prépare à afficher une liste des images sur les pages ASP.net comme les rouleaux du client bas de la page. Plus l'utilisateur descend et descend sur la page qu'il voit plus de photos. Cela signifie donc des chargements de pages rapides et une expérience utilisateur riche. (vous pouvez voir ce que je veux dire sur www.mashable.com, juste prendre soin des nouvelles charges des photos que vous faites défiler vers le bas.)

En outre, l'objet imgae retourné de la méthode ci-dessus, comment puis-je le montrer dans une boucle utilisant dynamiquement les conditions (*) ci-dessus.

Cordialement bk

Répondre

1

Eh bien, je pense que le principal goulot d'étranglement est en fait la base de données frappe chaque fois que vous avez besoin d'une image. (Surtout en considérant de nombreux utilisateurs qui accèdent au site.)

j'aller avec la solution suivante:

  1. Database enregistre les images avec la qualité d'origine;
  2. .ashx gestionnaire mettra en cache les images sur le système de fichiers dans différentes résolutions nécessaires (comme 32x32 pixels pour les icônes, 48x48 pour les vignettes, etc.) en les retournant sur demande et accédant à la base de données qu'une seule fois; (dans this un exemple est montré comment retourner une image via le gestionnaire ashx)
  3. Les pages réelles pointeront vers la page .ashx pour obtenir une image. (Comme <img scr="GetImage.ashx?ID=324453&Size=48" />)

MISE À JOUR:

Ainsi, le flux de travail réel dans le gestionnaire sera comme:

public void ProcessRequest (HttpContext context) 
    { 
     // Create path of cached file based on the context passed 
     int size = Int32.Parse(context.Request["Size"]); 
     // For ID Guids are possibly better 
     // but it can be anything, even parameter you need to pass 
     // to the web service in order to get those bytes 
     int id = Int32.Parse(context.Request["Id"]); 
     string imagePath = String.Format(@"images/cache/{0}/{1}.png", size, id); 

     // Check whether cache image exists and created less than an hour ago 
     // (create it if necessary) 
     if (!File.Exists(imagePath) 
      || File.GetLastWriteTime(imagePath) < DateTime.Now.AddHours(-1)) 
     { 
      // Get the file from the web service here 
      byte[] imageBytes = ... 

      // Save as a file 
      using (var memoryStream = new MemoryStream(imageBytes)) 
      using (var outputStream = File.OpenWrite(imagePath)) 
       Image.FromStream(memoryStream).Save(outputStream); 
     } 

     context.Response.ContentType = "image/png"; 
     context.Response.WriteFile(imagePath); 
    } 
+0

Les octets sont fournis par un service Web, comment puis-je intégrer à ashx fichier? ce qui concerne bk – theklc

+0

@blgnklc: Je pense que vous avez toujours besoin de mettre en cache les images sur le système de fichiers, en les récupérant au départ du service web si elles ne sont pas mises en cache. (Ajouter éventuellement une certaine expiration, comme "ignorer l'image du cache si le fichier a été créé hier".) – Regent

+0

merci pour votre aide. – theklc