Codice PHP:
<%@ Page Language="C#" Debug="true"%>
<%@ import Namespace="System.IO" %>
<%@ import Namespace="System.Drawing" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<script runat="server">
/* WBRESIZE 0.2
developer by imente 15/10/2006
parametri (da querystring):
f = nome del file originale
s = percentuale di ridimensionamento (es: 20)
w = larghezza fissata (la altezza viene calcolata di conseguenza per mantenere le dimensioni)
h = altezza fissata (la larghezza viene calcolata di conseguenza per mantenere le dimensioni)
*** si può indicare S oppure W oppure H. se si indica S, W e H vengono ignorati.
*** se si indica sia W che H viene forzato il ridimensionamento e non verranno rispettate le proporzioni
c = compressione jpeg (valori da 1 a 100)
*** se non impostata la compressione viene impostata a 75
t = cartella dove salvare la thumb
n = nome della thumb (se non indicato genera thumb.jpg)
r = pagina a cui redirigersi dopo aver effettuato il resize (se non indicato si redirige alla thumb)
*** se si indica T la thumb viene salvata
*** se non si indica T la thumb viene solo visualizzata (on the fly)
*/
// path dove sono posizionate le immagini di errore
string errorImagePath = "";
void Page_Load(Object sender, EventArgs e) {
// parametri
string fileName = (Request.QueryString["img"]==null)?"":"/public/"+Request.QueryString["img"]; // nome del file originale
string folder = (Request.QueryString["t"]==null)?"":Request.QueryString["t"]; // cartella dove salvare la thumb
string newName = (Request.QueryString["n"]==null)?"thumb.jpg":Request.QueryString["n"]; // nuovo nome del file
string redirect = (Request.QueryString["r"]==null)?(folder+"/"+newName):Request.QueryString["r"]; // redirezione dopo save
double requestedWidth = (Request.QueryString["w"]==null)?0:Convert.ToDouble(Request.QueryString["w"]); // larghezza impostata
double requestedHeight = (Request.QueryString["h"]==null)?0:Convert.ToDouble(Request.QueryString["h"]); // altezza impostata
int scaleFactor = (Request.QueryString["s"]==null)?0:Convert.ToInt32(Request.QueryString["s"]); // fattore di scalo per la miniatura
int compression = (Request.QueryString["c"]==null)?0:Convert.ToInt32(Request.QueryString["c"]); // compressione (0-100)
// variabili di servizio
int originalWidth = 0;
int originalHeight = 0;
int thumbWidth = 0;
int thumbHeight = 0;
if ( fileName.Trim().Length>0 ) {
try {
//carica l'immagine e ne recupera le dimensioni
System.Drawing.Image image;
image = System.Drawing.Image.FromFile( Server.MapPath(fileName) );
originalWidth = image.Width;
originalHeight = image.Height;
image.Dispose();
image = null;
//se una dimensione è più grande dell'immagine e l'altra no,
//la diminuisce fino a renderla pari all'immagine
if ( originalWidth > requestedWidth && originalHeight < requestedHeight ) requestedHeight = originalHeight;
if ( originalWidth < requestedWidth && originalHeight > requestedHeight ) requestedWidth = originalWidth;
if ( originalWidth >= requestedWidth && originalHeight >= requestedHeight && scaleFactor >= 0 && scaleFactor < 100 ) {
//l'immagine è da ridimensionare: calcola le dimensioni della miniatura
if ( scaleFactor == 0) {
if ( requestedWidth == 0 && requestedHeight != 0) {
// forzata requestedHeight
thumbWidth = Convert.ToInt32(Math.Ceiling(requestedHeight*originalWidth/originalHeight));
thumbHeight = Convert.ToInt32(requestedHeight);
} else if (requestedHeight == 0 && requestedWidth != 0) {
// forzata requestedWidth
thumbWidth = Convert.ToInt32(requestedWidth);
thumbHeight = Convert.ToInt32(Math.Ceiling(requestedWidth*originalHeight/originalWidth));
} else if (requestedHeight != 0 && requestedWidth != 0) {
// forzata sia requestedWidth che requestedHeight
thumbWidth = Convert.ToInt32(requestedWidth);
thumbHeight = Convert.ToInt32(requestedHeight);
} else {
// ERR: nessun parametro impostato
error(0);
return;
}
} else {
// scalata: percentuale delle dimensioni
thumbWidth = (originalWidth*scaleFactor/100);
thumbHeight = (originalHeight*scaleFactor/100);
}
} else {
// sovradimensionamento (si impostano le nuove dimensioni a 0 per evitare il ridimensionamento)
thumbWidth = 0;
thumbHeight = 0;
}
// esegue le operazioni di output
if ( folder != "" ) {
// output su file
Resize(fileName,thumbWidth,thumbHeight,folder+"\\"+newName,compression);
// redirezione
Response.Redirect(redirect);
} else {
// output diretto (come content-type="image/jpeg")
Resize(fileName,thumbWidth,thumbHeight,"",compression);
}
} catch (System.IO.FileNotFoundException ex) {
// ERR: immagine inesistente
error(2);
return;
} catch (Exception ex) {
Response.Write(ex.Message);
}
} else {
// ERR: nessuna immagine indicata
error(1);
return;
}
}
private void error(int error) {
// errore: visualizza una immagine di errore
System.Drawing.Image errImage;
errImage = System.Drawing.Image.FromFile( Server.MapPath(errorImagePath+"wbresize_err"+error+".gif") );
Response.ContentType = "image/gif";
errImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
errImage.Dispose();
errImage = null;
}
//
//
//queste sono le funzioni che servono per il ritaglio(almno penso)
//
//
public void ImgClip(ref Bitmap bmpSource, Rectangle clip)
{
Bitmap bmp = new Bitmap(clip.Width, clip.Height, bmpSource.PixelFormat);
bmp.SetResolution(bmpSource.HorizontalResolution, bmpSource.VerticalResolution);
bmp.Tag = bmpSource.Tag;
Graphics gr = Graphics.FromImage(bmp);
gr.Clear(Color.White);
//'imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.DrawImage(bmpSource, new Rectangle(0, 0, clip.Width, clip.Height), clip, GraphicsUnit.Pixel);
gr.Dispose();
bmpSource.Dispose();
bmpSource = bmp;
}
public void ImgClipCentra(ref Bitmap bmp, Rectangle clip, int contenitoreW, int contenitoreH, Color coloreSottofondo)
{
//taglio l'immagine
ImgClip(ref bmp, clip);
//creo il riquadro bianco
Bitmap bmp1 = new Bitmap(contenitoreW, contenitoreH, bmp.PixelFormat);
bmp1.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
bmp1.Tag = bmp.Tag;
Graphics gr = Graphics.FromImage(bmp1);
gr.Clear(coloreSottofondo);
//imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.DrawImage(bmp, new Rectangle((int)((contenitoreW - bmp.Width) / 2), (int)((contenitoreH - bmp.Height) / 2), bmp.Width, bmp.Height), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
bmp.Dispose();
gr.Dispose();
bmp = bmp1;
}
public void ImgClipCentra(ref Bitmap bmp, Rectangle clip, int contenitoreW, int contenitoreH)
{
ImgClipCentra(ref bmp, clip, contenitoreW, contenitoreH, Color.White);
}
//
//
//fine delle funzioni che ho copiato
//
//
private void Resize(string FileName, int requestedWidth, int requestedHeight, string NewFileName, int compression) {
FileStream file=new FileStream(Server.MapPath(FileName),FileMode.Open);
NewFileName = Server.MapPath(NewFileName);
//creo il bitmap dallo stream
System.Drawing.Image bmpStream=System.Drawing.Image.FromStream(file);
//creo un nuovo bitmap
Bitmap image;
//controllo valori in entrata
if (compression <= 0) compression = 100;
//se indicato lo ridimensiono
if (requestedWidth == 0 || requestedHeight == 0) image=new Bitmap(bmpStream);
else image=new Bitmap(bmpStream,new Size(requestedWidth,requestedHeight));
ImageCodecInfo jpegCodecInfo;
System.Drawing.Imaging.Encoder encoder;
EncoderParameter encoderParameter;
EncoderParameters encoderParameters;
jpegCodecInfo = GetEncoderInfo("image/jpeg");
encoder = System.Drawing.Imaging.Encoder.Quality;
encoderParameters = new EncoderParameters(1);
encoderParameter = new EncoderParameter(encoder, compression);
encoderParameters.Param[0] = encoderParameter;
if (NewFileName == "") {
// output su file
image.Save(NewFileName, jpegCodecInfo, encoderParameters);
} else {
// output diretto
Response.ContentType = "image/jpeg";
//
//
//QUI PROVO A RITAGLIARE, MA NON FUNZIONA!!! LO SCRIPT VA IN ERRORE...
//
//
ImgClipCentra(fileName, New Rectangle(50, 100, 280, 180));
image.Save(Response.OutputStream, jpegCodecInfo, encoderParameters);
}
image.Dispose();
image = null;
file.Close();
}
private ImageCodecInfo GetEncoderInfo(string mimeType) {
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j< encoders.Length; j++) {
if (encoders[j].MimeType == mimeType) {
return encoders[j];
}
}
return null;
}
</script>
attendo con ansia...