2009-09-02 4 views
0

J'ai écrit du code pour créer des bannières dynamiques. Il renvoie une variable bitmap. Est-il possible que je peux utiliser cette variable comme ImageUrl pour un <asp:Image />?Est-il possible d'utiliser un bitmap généré par du code dans un tag d'image asp?

Voici le code qui crée l'image:

public class SideImage 
{ 
    protected const int ImgCt = 4; 
    protected const int ImgW = 130; 
    protected const int ImgH = 150; 

    public Bitmap GenerateImage() 
    { 
     string serializedImage = CreateImage("side"); 

     if(!string.IsNullOrEmpty(serializedImage)) 
     { 
      using(MemoryStream ms = new MemoryStream(Convert.FromBase64String(serializedImage))) 
      { 
       Bitmap bitmap = new Bitmap(ms); 
       return bitmap; 
      } 
     } 
     return null; 
    } 

    protected string CreateImage(string path) 
    { 
     try 
     { 
      using (Bitmap canvas = new Bitmap(ImgW, (ImgCt * ImgH))) 
      { 
       using (Graphics canvasGraphic = Graphics.FromImage(canvas)) 
       { 
        List<FileInfo> fileList = new List<FileInfo>(); 
        DirectoryInfo directoryInfo = new DirectoryInfo(HttpContext.Current.Server.MapPath(path + "/")); 

        fileList.AddRange(directoryInfo.GetFiles("*.jpg")); 

        Randomizer<FileInfo> randomizer = new Randomizer<FileInfo>(); 

        fileList.Sort(randomizer); 

        int yOffset = 0; 
        for (int i = 0; i <= fileList.Count - 1; i++) 
        { 
         using (Image image = Image.FromFile(fileList[i].FullName)) 
         { 
          Rectangle rectangle = new Rectangle(0, yOffset, ImgW, ImgH); 
          canvasGraphic.DrawImage(image, rectangle); 
         } 
         yOffset += ImgH; 
        } 

        ImageCodecInfo[] imageCodecInfo = ImageCodecInfo.GetImageEncoders(); 
        using (EncoderParameters encoderParameters = new EncoderParameters(2)) 
        { 

         using (MemoryStream memoryStream = new MemoryStream()) 
         { 
          encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L); 
          encoderParameters.Param[1] = new EncoderParameter(Encoder.ColorDepth, 16L); 

          canvas.Save(memoryStream, imageCodecInfo[1], encoderParameters); 
          return Convert.ToBase64String(memoryStream.GetBuffer()); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
    } 
} 

public class Randomizer<T> : IComparer<T> 
{ 
    protected Random Salter; 
    protected int Salt; 
    protected SHA1 Sha1; 

    public Randomizer() 
    { 
     Salter = new Random(); 
     Salt = Salter.Next(); 
     Sha1 = new SHA1Managed(); 
    } 
    public Randomizer(int seed) 
    { 
     Salter = new Random(seed); 
     Salt = Salter.Next(); 
     Sha1 = new SHA1Managed(); 
    } 
    private int HashAndSalt(int value) 
    { 
     byte[] b = Sha1.ComputeHash(BitConverter.GetBytes(value)); 
     int r = 0; 
     for (int i = 0; i < (b.Length - 1); i += 4) 
     { 
      r = r^BitConverter.ToInt32(b, i); 
     } 
     return r^Salt; 
    } 

    public int Compare(T x, T y) 
    { 
     return HashAndSalt(x.GetHashCode().CompareTo(HashAndSalt(y.GetHashCode()))); 
    } 
} 

Répondre

3

Voir le contenu de ce question pour quelques approches différentes à ce genre de chose.

(Évidemment, je préfère le mien;)).

1

Cela semble similaire à la façon dont fonctionnent les générateurs de tableau. Il y a deux approches à cela que j'ai vues. L'un est de créer un fichier sur le serveur, puis pointez sur cela. L'autre consiste à stocker le bitmap en mémoire, puis à appeler une page aspx à la place de l'image. La page ASP lirait le bitmap de la mémoire et retournerait au navigateur.

+0

OK Je pense que c'est ce que j'ai fait avant, à l'origine dans VB.NET. Merci! – Anders

0

Je créerais un module HTTP pour faire ceci.

Vous pouvez configurer le module HTTP pour intercepter toutes les demandes dans un dossier particulier ('/ images/generated /') par exemple. Puis, lorsque vous obtenez une demande d'image dans ce dossier, le code de votre module HTTP est appelé. Créez votre image en mémoire et écrivez-la dans l'objet Response (après avoir défini les en-têtes et les objets de type MIME appropriés en premier).

Dans votre code HTML, vous pouvez ensuite écrire une étiquette d'image comme <img src="/images/generated/image-doesnt-physically-exist.jpg" /> et récupérer une image. J'espère que cela vous aidera à vous orienter dans la bonne direction!

+0

Un HttpHandler serait la meilleure option dans ce cas, pas un HttpModule. –

Questions connexes