Segnala il sito a un amico |
|
|
Se hai trovato questa pagina interessante, scrivilo ad un amico, clicca qui |
|
|
NEW!! GiDiNet Web Directory |
|
|
GiDiNet Directory è una Web Directory divisa in più aree tematiche in cui potrete
trovare comodamente siti che trattano argomenti di vostro interesse, continua... |
|
|
Statistiche |
|
Oggi
21/11/2024
sei il visitatore n.
per un totale di
visitatori dal 23/04/2007
|
|
|
|
|
Hai un problema particolare? Non trovi quello che stai cercando? clicca qui!
Resize immagini automatico con cache in ASP.NET
Lo script pubblicato in questa pagina, è una versione rivista di Thumbnails automatiche con cache in ASP.NET, questa nuova versione dello script permette di impostare il formato utilizzato e la qualità della compressione, ed è quindi adatto anche per ridimensionare immagini in alta risoluzione.
E' sempre possibile creare in automatico le immagini ridimensionate richiamando lo script direttamente dalla proprietà src del tag img, quindi questo script può essere utilizzato anche su siti scritti con tecnologie diverse da ASP.NET, senza dover fare modifiche.
Questo script ha due modalità di funzionamento:
Con cache: Salva su disco una copia di ogni thumbnail/immagine che poi verrà riutilizzata nelle chiamate successive, questa modalità richiede l'uso di una directory con i permessi in scrittura.
Senza cache: Crea sempre le thumbnails/immagini a runtime, qui si potrà risparmiare spazio su disco, tuttavia le prestazioni saranno limitate.
1. Installazione dello script
Per l'installazione dello script è sufficiente copiare il file advancedresizetool.aspx sul proprio spazio web, configurarlo e richiamarlo seguendo le istruzioni al punto 2
Scarica i sorgenti completi
Codice del file advancedresizetool.aspx:
<%@ Page Language="VB" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Drawing" %>
<script runat="server">
'Copyright (C) 2007 Daniele Iunco
'This program is free software; you can redistribute it and/or modify
'it under the terms of the GNU General Public License as published by
'the Free Software Foundation; either version 2 of the License, or
'(at your option) any later version.
'This program is distributed in the hope that it will be useful,
'but WITHOUT ANY WARRANTY; without even the implied warranty of
'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
'GNU General Public License for more details.
'You should have received a copy of the GNU General Public License along
'with this program; if not, write to the Free Software Foundation, Inc.,
'51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
'advancedresizetool.aspx v1.0
'Author: Daniele Iunco - http://www.gidinet.com
'Date: 28th September 2007
'Limite massimo per l'altezza in pixel
Private Const MaxHeightSafe As Integer = 600
'Limite massimo per la larghezza in pixel
Private Const MaxWidthSafe As Integer = 800
'Percorso dell'immagine su cui reindirizzare le richieste non valide
Private Const ErrorImagePath As String = "/error.jpg"
'Percorso in cui salvare le copie delle immagini, il percorso indicato deve avere i permessi in scrittura
Private Const ImageCachePath As String = "/public/tempfiles"
'Salva su disco una copia riutilizzabile delle thumbnails create
Private Const UseCache As Boolean = True
'Di seguito sono riportati i valori predefiniti che verranno utilizzati quando non vengono specificati parametri
Private Const DefaultHeight As Integer = 600
Private Const DefaultWidth As Integer = 800
Private Const DefaultResizeMode As ResizeMode = ResizeMode.AutoResize
Private Const AllowCustomFormat As Boolean = False 'Impostare a False per ignorare il parametro del formato, True per utilizzarlo
Private Const AllowCustomQuality As Boolean = False 'Impostare a False per ignorare il parametro della qualità, True per utilizzarlo
Private Const MinQuality As Long = 10 'Qualità minima
Private Const DefaultQuality As Long = 30 'Qualità predefinita
Private Const MaxQuality As Long = 100 'Qualità massima
Private Enum ResizeMode
AutoResize = 0
ManualResize = 1
End Enum
Private ReadOnly Property Mode() As ResizeMode
Get
Dim myReqMode As String = Request.QueryString("mode")
If myReqMode Is Nothing OrElse Not IsNumeric(myReqMode) Then Return DefaultResizeMode
If CInt(myReqMode) = 0 Then Return ResizeMode.AutoResize Else Return ResizeMode.ManualResize
End Get
End Property
Private ReadOnly Property CustomQuality() As Long
Get
Dim myValue As String = Request.QueryString("quality")
If myValue Is Nothing OrElse Not IsNumeric(myValue) Then Return DefaultQuality
Dim myNumValue As Long = CLng(myValue)
If myNumValue > MaxQuality OrElse myNumValue < MinQuality Then
Return DefaultQuality
Else
Return myNumValue
End If
End Get
End Property
Private ReadOnly Property MaxHeight() As Integer
Get
Dim myValue As String = Request.QueryString("height")
If myValue Is Nothing OrElse Not IsNumeric(myValue) Then Return DefaultHeight
Dim myIntValue As Integer = CInt(myValue)
If myIntValue < MaxHeightSafe Then
Return myIntValue
Else
Return MaxHeightSafe
End If
End Get
End Property
Private ReadOnly Property MaxWidth() As Integer
Get
Dim myValue As String = Request.QueryString("width")
If myValue Is Nothing OrElse Not IsNumeric(myValue) Then Return DefaultWidth
Dim myIntValue As Integer = CInt(myValue)
If myIntValue < MaxWidthSafe Then
Return myIntValue
Else
Return MaxWidthSafe
End If
End Get
End Property
Private _ImagePath As String
Private ReadOnly Property ImagePath() As String
Get
If Not _ImagePath Is Nothing Then Return _ImagePath
Dim sRequestPath As String = Request.QueryString("path")
If sRequestPath Is Nothing Then Return Nothing
'Rimuovo le doppie / e i doppi . con le espressioni regolari
sRequestPath = Regex.Replace(sRequestPath, "\/{2,}", "/")
sRequestPath = Regex.Replace(sRequestPath, "\.{2,}", ".")
If sRequestPath.Substring(0, 1) = "/" Then sRequestPath = sRequestPath.Substring(1)
_ImagePath = sRequestPath
Return _ImagePath
End Get
End Property
Sub Page_Load(ByVal Sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
Dim LocalImageFilePath As String
Dim LocalThumbnailCacheFilePath As String
LocalImageFilePath = Server.MapPath("/" & ImagePath)
If Not File.Exists(LocalImageFilePath) Then
Response.Redirect(ErrorImagePath)
Exit Sub
End If
Dim myImageFormatString As String
Dim myImageFormatClass As System.Drawing.Imaging.ImageFormat
If AllowCustomFormat = False Then
myImageFormatString = "jpeg"
myImageFormatClass = System.Drawing.Imaging.ImageFormat.Jpeg
Else
Dim myType As String = Request.QueryString("format")
If myType Is Nothing Then
myImageFormatClass = System.Drawing.Imaging.ImageFormat.Jpeg
myImageFormatString = "jpeg"
Else
Select Case myType.Trim.ToLower
Case "jpeg"
myImageFormatClass = System.Drawing.Imaging.ImageFormat.Jpeg
myImageFormatString = "jpeg"
Case "png"
myImageFormatClass = System.Drawing.Imaging.ImageFormat.Png
myImageFormatString = "png"
Case Else
myImageFormatClass = System.Drawing.Imaging.ImageFormat.Jpeg
myImageFormatString = "jpeg"
End Select
End If
End If
Dim ImageQuality As Long
If AllowCustomQuality Then
ImageQuality = CustomQuality
Else
ImageQuality = DefaultQuality
End If
Dim TempFilePath As String = Server.MapPath(ImageCachePath)
LocalThumbnailCacheFilePath = Path.Combine(TempFilePath, ImagePath.Replace("/", "_")) & "_" & Int(Mode) & "_" & Int(MaxWidth) & "_" & Int(MaxWidth) & "_" & ImageQuality & "." & myImageFormatString & ".thumb"
Dim mySourceFile As New System.IO.FileInfo(LocalImageFilePath)
If UseCache Then
If File.Exists(LocalThumbnailCacheFilePath) Then
Dim myDestFile As System.IO.FileInfo
myDestFile = New System.IO.FileInfo(LocalThumbnailCacheFilePath)
'Se il file della thumbnail è stato modificato nella stessa data oppure in seguito
'rispetto al file sorgente allora può essere utilizzato quello
If myDestFile.LastWriteTime.CompareTo(mySourceFile.LastWriteTime) >= 0 Then
'Il file esiste e va bene
Response.ContentType = "image/" & myImageFormatString
Response.WriteFile(myDestFile.FullName)
Exit Sub
Else
'Il file esiste ma è vecchio e va sostituito
myDestFile.Delete()
End If
End If
End If
Dim orginalimg As System.Drawing.Image
Try
orginalimg = System.Drawing.Image.FromFile(mySourceFile.FullName)
Catch
Response.Redirect(ErrorImagePath)
Exit Sub
End Try
Dim ThumbnailWidth, ThumbnailHeight As Integer
Select Case Mode
Case ResizeMode.AutoResize
' ResizeMode.AutoResize: Ridimensiona l'immagine per restare nei limiti impostati, mantenendo le proporzioni
Dim myRatio As Double = orginalimg.Width / orginalimg.Height
If myRatio > 1 Then 'La larghezza è maggiore dell'altezza, quindi fisso l'altezza e calcolo il resto
ThumbnailHeight = MaxHeight
ThumbnailWidth = orginalimg.Width / orginalimg.Height * MaxHeight
ElseIf myRatio < 1 Then 'L'altezza è maggiore della larghezza, quindi fisso la larghezza e calcolo il resto
ThumbnailWidth = MaxWidth
ThumbnailHeight = orginalimg.Height / orginalimg.Width * MaxWidth
ElseIf myRatio = 1 Then 'Larghezza = Altezza
ThumbnailWidth = MaxWidth
ThumbnailHeight = MaxHeight
End If
Case ResizeMode.ManualResize
' ResizeMode.ManualResize: Ridimensiona con le misure indicate nei parametri
ThumbnailWidth = MaxWidth
ThumbnailHeight = MaxHeight
End Select
Response.ContentType = "image/" & myImageFormatString
Dim panel As Bitmap
panel = New Bitmap(ThumbnailWidth, ThumbnailHeight, Imaging.PixelFormat.Format24bppRgb)
Dim g As Graphics = Graphics.FromImage(panel)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g.DrawImage(orginalimg, 0, 0, ThumbnailWidth, ThumbnailHeight)
Dim stream As System.IO.Stream = Response.OutputStream
Dim MemStream As New System.IO.MemoryStream()
If myImageFormatClass.Equals(System.Drawing.Imaging.ImageFormat.Jpeg) Then
Dim Info() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders
Dim Params As New System.Drawing.Imaging.EncoderParameters(1)
Params.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ImageQuality)
panel.Save(MemStream, Info(1), Params)
Else
panel.Save(MemStream, myImageFormatClass)
End If
g.Dispose()
panel.Dispose()
If UseCache Then
Dim myS As New IO.FileStream(LocalThumbnailCacheFilePath, IO.FileMode.CreateNew)
MemStream.WriteTo(myS)
myS.Close()
Response.WriteFile(LocalThumbnailCacheFilePath)
Else
MemStream.WriteTo(Response.OutputStream)
End If
orginalimg.Dispose()
MemStream.Close()
MemStream.Dispose()
Catch ex As Exception
Response.Redirect(ErrorImagePath)
End Try
End Sub
</script>
2. Configurazione e uso dello script
Per la configurazione è necessario modificare i parametri nel file advancedresizetool.aspx seguendo le istruzioni riportate di seguito:
Private Const MaxHeightSafe As Integer = 600: Impostare l'altezza massima che può essere accettata come parametro.
Private Const MaxWidthSafe As Integer = 800: Impostare la larghezza massima che può essere accettata come parametro.
Private Const ErrorImagePath As String = "/error.jpg": Scrivere il percorso dell'immagine da visualizzare in caso di errori.
Private Const ImageCachePath As String = "/public/tempfiles": Scrivere il percorso da utilizzare per il salvataggio delle thumbnails create.
Private Const DefaultHeight As Integer = 600: Impostare l'altezza predefinita utilizzata in mancanza del relativo parametro.
Private Const DefaultWidth As Integer = 800: Impostare la larghezza predefinita utilizzata in mancanza del relativo parametro.
Private Const DefaultResizeMode As ResizeMode = ResizeMode.AutoResize: Impostare la modalità predefinita da utilizzare in mancanza del relativo parametro come indicato di seguito:
- ResizeMode.AutoResize effettua il ridimensionamento automatico mantenendo le proporzioni, le misure impostate verranno utilizzate come misure massime della thumbnail, che tuttavia sarà ridimensionata mantenendo le proporzioni originali.
- ResizeMode.ManualResize effettua il ridimensionamento utilizzando le misure specificate nei parametri senza mantenere le proporzioni.
Private Const UseCache As Boolean = True: Se impostato su True abilita il sistema di cache delle immagini, le thumbnail verranno create la prima volta, e richiamate dalla cache le volte successive; se impostato su False disabilita la cache.
Private Const AllowCustomFormat As Boolean = False: True - permette di specificare il formato tramite il parametro "format", in questa versione si è scelto di permettere l'uso dei soli formati png e jpg; False - Ignora il parametro
Private Const AllowCustomQuality As Boolean = False: True - permette di specificare la qualità della compressione jpeg tramite il parametro "quality"; False - ignora il parametro
Private Const MinQuality As Long = 10: Qualità minima accettata come parametro (con AllowCustomQuality = True)
Private Const DefaultQuality As Long = 30: Qualità predefinita con AllowCustomQuality = False
Private Const MaxQuality As Long = 100: Qualità massima accettata come parametro (con AllowCustomQuality = True)
Le copie delle immagini verranno salvate nel percorso indicato in ImageCachePath che dovrà avere i permessi in scrittura.
Al momento della generazione delle thumbnails lo script confronta in automatico le date di modifica dei file, se non è presente una copia aggiornata in cache, la vecchia copia sarà cancellata e sostituita da una nuova.
Il percorso su cui saranno salvate le copie delle thumbnail potrà essere svuotato manualmente quando necessario per liberare spazio, sarà necessario svuotare il percorso della cache anche in seguito alla cancellazione delle immagini dal sito, in modo da rimuovere le copie cache di immagini che non sono più presenti sullo spazio web.
Per utilizzare lo script è sufficiente richiamarlo direttamente passando i parametri necessari, ad esempio se lo script si trova in /script/advancedresizetool.aspx, sarà possibile ridimensionare l'immagine rihiamando l'indirizzo:
/script/advancedresizetool.aspx?format=formato&quality=qualita&mode=modalita&width=larghezzamax&height=altezzamax&path=percorsoimmagine
Dettagli dei parametri:
formato(opzionale, richiede AllowCustomFormat = True), sostituire con jpeg o png.
qualita(opzionale, richiede AllowCustomQuality = True), sostituire con un numero compreso tra MinQuality e MaxQuality.
modalita(opzionale), sostituire con 0 per ridimensionare mantenendo le proporzioni, 1 per non mantenerle, se il parametro non viene specificato verrà utilizzata la modalità predefinita impostata nello script.
larghezzamax(opzionale), sostituire con la larghezza massima in pixel, se il parametro non viene specificato verrà utilizzata la larghezza predefinita impostata nello script.
altezzamax(opzionale), sostituire con l'altezza massima in pixel, se il parametro non viene specificato verrà utilizzata l'altezza predefinita impostata nello script.
percorsoimmagine(richiesto), sostituire con il percorso dell'immagine, ad esempio /immagini/miafoto.jpg
ad esempio, avendo un'immagine /immagini/miafoto.jpg, e volendo creare una versione ridimensionata di massimo 200 pixel di larghezza e 150 pixel di altezza, in jpeg con qualità 40, mantenendo le proporzioni, si dovrà richiamare l'indirizzo:
/script/advancedresizetool.aspx?format=jpeg&quality=40&mode=0&width=200&height=150&path=/immagini/miafoto.jpg
Pubblicato da: Daniele Iunco il 28/09/2007
|
|
|