• User Attivo

    thumbnails su galleria dinamica

    Ciao ragazzi, ho un piccolo problema con una galleria di immagini.

    Eseguo upload delle immagini mediante classe di Baol e quindi salvo le img nella cartella public ed il relativo percorso in un campo di tabella su db access --> e fin qui no problem!

    Nella pagina in cui devo visualizzare le immagini (galleria.asp) sto usando un javascript per vederne le miniature: cliccando sulle miniature vedo le immagini a dimensione "normale" attraverso lighbox --> il problema è che spesso e volentieri al posto delle miniature vedo direttamente le immagini a dim reale (magari solo alcune della galleria mentre altre sono piccole come dovrebbero: in sostanza questo script non funziona!!!)

    Arrivando al dunque vi chiedo se esiste uno script più stabile da poter utilizzare per fare un resize (non in percentuale ma a dimensione fissa che mantenga però l'aspect ratio) e visualizzare dunque le thumbnails delle immagini salvate in /public (e relativo percorso su db).

    Sono hostato su Aruba con tutti i limiti che voi ben conoscete (no dll o componenti varie).

    Sono a digiuno di ASp .net che sò potrebbe fare al caso mio.

    Sarebbe ottimo trovare un qualcosa di parzialmente già fatto per fare l'operazione di cui sopra --> un resize al volo!

    Grazie.


  • User Attivo

    ok, ok, cerco di riproporre il problema in un'altra maniera.

    Ho trovato il seguente script che mi permette di creare le miniature delle immagini che compongono la mia galleria:

    
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System" %>
    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Web" %>
    <%@ Import Namespace="System.Drawing" %>
    <script runat="server">
          '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>
    
    

    Le miniature appunto vengo generate nella pagina Asp della galleria mediante il seguente indirizzo

    
    advancedresizetool.aspx?format=*jpeg*&quality=*40*&mode=*0*&width=*200*&height=*150*&path=*/immagini/miafoto.jpg*
    
    

    Come faccio ad inserire nel precedente indirizzo il path di una immagine il cui percorso è salvato in un campo di tabella su db access?

    Ovvero, devo inserire l'indirizzo sopra nel seguente script nel primo img src:

    
    <% if rs("immg1")<>"" then
    response.write ("<a href=public"&rs("immg1")&" rel='lightbox[ciao]'><**img src='public"&rs("immg1")&"**' id='resizable_1' border='0'/></a>")
    else
    response.write ("<img src='images/all.gif'>")
    end if
    %>
    
    

    al posto dell'attuale img src.

    Potreste gentilmente aiutarmi?

    Grazie


  • Super User

    Se ho capito bene su rs("immg1") c'è il path dell'immagine, non potresti inserire quel campo dinamico nell'url che hai indicato sopra?


  • User Attivo

    grazie cali per l'interessamento.

    E' proprio quello il problema, non so come fare, ho provato così ma non funziona...

    
     <% if rs("immg2")<>"" then
    response.write ("<a href=public"&rs("immg2")&" rel='lightbox[ciao]'>**<img src='resize_ok.aspx?format=jpeg&quality=40&mode=0&width=200&height=150&path=/immagini/<%=rs("immg2")%>'/>**</a>")
    else
    response.write ("<img src='images/all.gif'>")
    end if
    %>
    
    

  • Super User

    Non funziona che vuol dire? Da un indirizzo errato e errore?


  • User Attivo

    ok, ho risolto così

    
    response.write ("<a href=public"&rs("immg2")&" rel='lightbox[ciao]'><img src='resize_ok.aspx?format=jpeg&quality=40&mode=0&width=100&height=150&path=/immagini/"& rs("immg2") &"'/></a>")
    
    

    ora però il problema è che non vedo proprio la miniatura con le dimensioni indicate nella stringa ma vedo solo una barretta verticale...

    Non mastico nulla di asp .net con cui è scritto lo script che fa il resize al volo.

    Riusciresti ad indicarmi dove devo dargli le dimensioni della larghezza a cui voglio resizare le img?


  • Super User

    Vuol dire penso che non crea l'immagine, quello script non so come funziona, dovresti innanzitutto vedere se l'url dell'immagine è giusto, cioè se l'url creto da /immagini/"& rs("immg2") è in effetti un'immagine valida. Puoi scrivere qui sotto l'url generato?


  • User Attivo

    dove lo vedo l'url generato?


  • Super User

    Nel codice html della pagina.


  • User Attivo

    scusa ma non lo trovo, non capisco


  • Super User

    Scusa ma tu quel codice dove lo stai mettendo? Dentro una pagina asp no? E poi come la testi? Aprendola nel browser immagino no? Ok, nella pagina dove vedi la barretta verticale, vedi il sorgente html, li dentro da qualche parte c'è <a href=public...> <img src='resize_ok.asp?.... Io vorrei vedere quel codice html, oppure avere un link alla pagina se è online.


  • User Attivo

    ok cali, sono riuscito a sistemare, era semplicemente sbagliato il path --> puntava ad un'altra cartella dove ovviamente non trovava nulla.

    Ti ringrazio per la pazienza e per il prezioso aiuto.

    Grazie ancora!!!!!!