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.