Pagina 1 di 8 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 77
  1. #1

    [1.1-C#] [wbresize 0.2] ridimensionare e compressione jpeg

    ecco qui lo script completo per il ridimensionamento (creazione thumbnails) con gestione della compressione

    è un file unico da chiamare wbresize.aspx
    le informazioni da passare in querystring le trovate spiegate in commento nelle prime righe

    vi sono anche 3 file immagine di errore
    trovate tutto nello zip qui
    http://www.imente.it/wbresize0.2.zip

    codice:
    <%@ Page Language="C#" %>
    <%@ 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["f"]==null)?"":Request.QueryString["f"]; // 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)?75: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;
    }
    
    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";
    		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>
    sentitevi liberi di commentare
    sto cercando di imparare
    san imente saluta

    * http://simonecingano.it *

  2. #2
    wbresize 0.21
    alcuni bugfix (piccole cose, ma importanti)

    http://www.imente.it/wbresize0.21.zip

    (nel mio piccolo comunque mi aspettavo un qualche commento )
    san imente saluta

    * http://simonecingano.it *

  3. #3
    Utente di HTML.it L'avatar di 99eros9
    Registrato dal
    Jan 2003
    Messaggi
    2,637
    Faccio 2 premesse:
    ho molto stimato i tuoi lavori in vb6 oltre al tuo progetto originale (mi riferisco al forum) e anche io, come te, stò imparando questa tecnologia.
    Senza entrare nel merito della funzionalità, mi permetto di discutere sul concetto di OOP e cioè, io non sono pienamente d'accordo di inserire questo codice inline e (quì mi addentro in qualcosa che sto cercando di assimilare), forse non sarebbe stato meglio svolgere questo tipo di controllo attraverso un CustomValidator e il gestore dell'evento ServerValidate, ponendo questo codice in una classe?
    Ripeto, mi stò sforzando di imparare anche io quindi, come te, aspetto che qualche guru fornisca consigli utili
    Saluti.
    Tala är silver men tiga är guld!
    Pubblica il tuo curriculum
    Segnala il tuo sito
    Ancl

  4. #4
    bene... finalmente un po' di discussione.

    "svolgere questo tipo di controllo attraverso un CustomValidator e il gestore dell'evento ServerValidate, ponendo questo codice in una classe?"

    ok.
    non so di cosa parli ^^


    il motivo per cui non ne ho fatto una classe è semplice, a me serviva una pagina che lavorasse, niente di più.

    se mi spieghi i pro (e soprattutto cos'è un customvalidator) si valuta

    sono qui per imparare come te...
    san imente saluta

    * http://simonecingano.it *

  5. #5
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288
    Ohi Simo, bello script.
    Quello che dice eros è giustissimo.
    Un tipo di codice inline cosi' puo' permettere di essere utilizzato come service da una pagina asp per esempio, dato che hai impostato tutto via Querystring.
    In ottica asp.net pura, invece la possibilita' di creare uno user control o una classe a parte con tanto di eventi, puo' essere la soluzione ottimale.

  6. #6
    Utente di HTML.it L'avatar di 99eros9
    Registrato dal
    Jan 2003
    Messaggi
    2,637
    oh klusterino, buon dì
    Si, io intendevo spostare l'attenzione sulla riusabilità del codice attraverso l'implementazione di una classe.
    Poi, mi sembra, che impostare tutto su un transfer con query string sia un approccio sbagliato in virtù del postback... in fondo, correggimi se sbaglio imente, quel tipo di operazioni vanno fatte a condizione che il file non rispetti determinate caratteristiche, giusto?
    Tala är silver men tiga är guld!
    Pubblica il tuo curriculum
    Segnala il tuo sito
    Ancl

  7. #7
    Originariamente inviato da kluster
    Un tipo di codice inline cosi' puo' permettere di essere utilizzato come service da una pagina asp per esempio, dato che hai impostato tutto via Querystring.
    l'idea per me era questa ^^

    sinceramente le mie conoscenze non sono ancora abbastanza solide per affrontare la creazione di un user control

    (se ci sei fatti vedere su msn che ti dico due cose)
    san imente saluta

    * http://simonecingano.it *

  8. #8
    Originariamente inviato da 99eros9
    in fondo, correggimi se sbaglio imente, quel tipo di operazioni vanno fatte a condizione che il file non rispetti determinate caratteristiche, giusto?
    in realtà per me no....

    io sto utilizzando questo file aspx all'interno di un progetto ASP, nel quale vengono inserite immagini che poi devono essere obbligatoriamente ridimensionate.

    nel mio caso questa soluzione è la migliore

    sicuramente in un progetto aspx una classe sarebbe sicuramente più funzionale.
    san imente saluta

    * http://simonecingano.it *

  9. #9
    Utente di HTML.it L'avatar di maspar
    Registrato dal
    Mar 2001
    Messaggi
    276
    Originariamente inviato da imente
    in realtà per me no....

    io sto utilizzando questo file aspx all'interno di un progetto ASP, nel quale vengono inserite immagini che poi devono essere obbligatoriamente ridimensionate.

    nel mio caso questa soluzione è la migliore

    sicuramente in un progetto aspx una classe sarebbe sicuramente più funzionale.
    Ciao Imente, come al solito sforni idee spumeggianti

    Mi piacerebbe utilizzare il tuo WBresize in un progetto interamente in asp, visto che di Asp net non ci capisco una mazza, potresti fare un esempio di utilizzo da ASP ad ASP.net?
    Io ho provato a fare qualche prova ma non succede nulla!


    Non discutere mai con un idiota: la gente potrebbe non notare la differenza. (Arthur Bloch)

    Ricchezza di fini, semplicità di mezzi. (Arne Naess)

  10. #10
    l'utilizzo da asp è veramente semplice

    ESEMPIO 1

    pagina1.asp
    codice:
    <%
    'codice vario
    dim immagine
    immagine = "image.jpg"
    
    response.redirect("wbresize.aspx?f=" & immagine & "&h=90&c=100&t=public&n=temp.jpg&r=pagina2.asp")
    
    %>
    attenzione
    'se volete passare dei parametri alla pagina2.asp ovviamente non potete usare &
    si usa all'ora la versione codificata
    ovvero "%26"

    es: "wbresize.aspx?f=............&r=pagina2.asp?param1 =a%26param2=b%26param3=c"

    pagina2.asp
    codice:
    <%
    
    'SPOSTA CON FSO IL FILE /public/thumb.jpg NELLA POSIZIONE CORRETTA (che gli verrà passata da parametro)
    
    %>
    ATTENZIONE
    perché non faccio salvare subito a WBRESIZE.ASPX nella path corretta?
    per il semplice motivo che sui file asp posso applicare le restrizioni di accesso del vostro admin, del vostro sistema di login, al contrario in un sistema asp già scritto non è possibile fare lo stesso sul file aspx (che è solo un modulo esterno).
    per questo gli si impone di scrivere sempre nello stesso posto (ancor meglio sarebbe modificare due righe di codice dell'aspx, niente di trascendentale) e nella pagina di ritorno si sposta il file (pagina asp che sottosta al sistema di login o admin ed è quindi controllata) nella sua posizione corretta.

    [hr]

    ESEMPIO2

    codice:
    <html>
    ...
    [img]wbresize.aspx?f=immagine.jpg&amp;c=75&amp;h=100&amp;w=100[/img]
    ...
    </html>
    questo è un esempio di utilizzo on the fly.
    in pratica viene creata l'immagine modificata, ma non viene salvata da nessuna parte, ma semplicemente data in output (e in questo caso dentro un'immagine nella pagina)
    nel caso specifico impongo un resize a 100x100 con compressione al 75

    [hr]

    spero di esser stato sufficientemente chiaro
    per ogni dubbio sono qui.

    ovviamente leggete i commenti dentro al file wbresize.aspx per quanto riguarda i parametri da passare
    san imente saluta

    * http://simonecingano.it *

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.