in

DotNetSide

Dot Net South Italy Developers User Group

Tips

November 2009 - Posts

  • Upload e resize di Immagini in Asp.Net

    di Giulio Preite

     

    Più di una volta mi sono trovato di fronte al problema di fare l’upload di immagini verso un sito internet e di ridimensionarle rendendole adatte alla pagina che le andrà a contenere.

    Ci sono differenti approcci al problema, da quello più semplice, che ridimensiona le immagini quando vengono richiamate  dall’utente, per così dire “on the fly”, a soluzioni più complesse, che recuperano dimensioni e risoluzione, al fine di attuare il resize più adatto.

    La mia si affianca ad esse, utilizzando lo streaming. Ecco quindi la classe:

    public class ResizeManager
    {
        private void ResizeAndSave(Stream imgStr, string FileName)
        {

            //creo il bitmap dallo stream
            System.Drawing.Image bmpStream = System.Drawing.Image.FromStream(imgStr);

            //creo un nuovo bitmap ridimensionandolo 
            double q = bmpStream.Width / 3;
            int W;

            W = (int)q;
            double g = bmpStream.Height / 3;

            int H;

            H = (int)g;
            Bitmap img = new Bitmap(bmpStream, new Size(W, H));

            //salvo l'immagine ridimensionata
            img.Save(FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

        public string Upload(FileUpload File1)
        {

            //controllo che sia un jpg
            if (File1 != null || File1.PostedFile.ContentType == "image/jpeg")
            {
                string myFoto = File1.FileName;          

                //salvo così com'è
                File1.SaveAs(@"C:........\Public\" + myFoto);

                //Creo lo Stream e lo passo alla funzione insieme alle dimensioni al percorso e al nome del file.
                MemoryStream DataM = new MemoryStream(File1.FileBytes);
                ResizeAndSave(DataM, @"C:…..\Public\Thumbs\" + myFoto);
                return myFoto;
            }

            // se la verifica non va a buon fine viene restituito il logo.
            else { return "logo.jpg"; };     
        }
    }

    La classe recupera il file (caricato tramite l’user control FileUpload) crea la bitmap dallo stream (il file non è ancora caricato sul server) e lo ridimensiona.

    Ho usato il coefficente 3, ma può anche essere diverso. Preferisco utilizzare dei coefficienti, poiché non sempre la dimensione verticale è direttamente proporzionale a quella orizzontale, e, inoltre, possiamo trovarci di fronte ad una immagine che ha una altezza maggiore della larghezza. Una soluzione alternativa consiste nel recuperare le dimensioni e regolarsi di conseguenza, nel momento del resize.

    Una volta completato il resize, l’immagine, cosi modificata (in streaming) viene salvata (uplodata) nella cartella Thumbs.

    Infine, l’immagine originale (anche in questo caso la si può ridimensionare) viene salvata nella cartella Public.

    Un altra cosa molto importante è questa: va passato il percorso fisico della cartella all’interno del server, partendo ad esempio da C: o D:.

    Un’ultima cosa, i namespace:

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.IO;
    using System.Net;
    using System.Drawing;
    using System.Web.UI.WebControls;

    Al prossimo tips.

Powered by Community Server (Commercial Edition), by Telligent Systems