• User Attivo

    [Asp.Net] Crop e resize rettangolare

    In rete ho trovato degli script asp.net (che io richiamo da pagine asp) che mi fanno il crop e il resize dell'immagine...l'unico problema è che tagliano l'immagine in un quadrato mentre io avrei bisogno di un'immagine rettangolare.

    Ho cercato in giro ma non ho trovato niente.


  • User Attivo

    Non si può sempre trovare la cosa specifica che ci serve. Spesso bisogna adattare quello che c'è.
    Quello che hai trovato è gia un'ottima base di partenza.

    Se non è troppo codice prova a postarlo (l'aspx). Vediamo se è fattibile velocemente.


  • User Attivo

    Ti ringrazio...io programmo in asp ma prima o poi dovrò cominciare a imparare asp.net.

    
    <%@ Page Language="VB"%>
    <%@ import Namespace="System.Drawing"%>
    <%@ import Namespace="System.Drawing.Imaging"%>
    <%@ import Namespace="System.Text.RegularExpressions"%>
    
    <%
    dim strFilename as string
    dim i as System.Drawing.Image
    dim b as System.Drawing.bitmap
    dim g as graphics
    If Left(request.QueryString("img"),4) = "http" then
        'Response.Write("case1<br/>")
        strFilename=server.mappath(right(request.QueryString("img"),len(request.QueryString("img"))-len(Request.ServerVariables("SERVER_NAME"))-7))
    else
        'Response.Write("case2<br/>")
        strFilename = server.mappath(request.QueryString("img"))
    end if
    i = System.Drawing.Image.FromFile(strFilename)
    b = New system.drawing.bitmap(request.QueryString("opx"), request.QueryString("opx"), pixelformat.format24bpprgb)
    g = graphics.fromimage(b)
    g.InterpolationMode = 2
    g.SmoothingMode = 4
    g.PixelOffsetMode = 4
    g.CompositingQuality = 4
    
    ? scale and translate the image
    Dim NewLar, NewAlt, SrcX, SrcY
    If i.height>i.width then
        NewLar = i.width
        NewAlt = i.width
        SrcX=0
        SrcY = (((i.height*request.QueryString("opx"))/i.width)-request.QueryString("opx"))/2
    else
        NewLar = i.height
        NewAlt = i.height
        SrcY = 0
        SrcX = (((i.width*request.QueryString("opx"))/i.height)-request.QueryString("opx"))/2
    
    end if
    g.drawimage(i,New rectangle(0,0,request.QueryString("opx"),request.QueryString("opx")), New rectangle(SrcX,SrcY,NewLar,NewAlt), GraphicsUnit.Pixel)
    'Response.Write(NewLar & " " & NewAlt & " " & SrcX & " " & SrcY)
    response.contenttype="image/jpeg"
    b.save(response.outputstream, imageformat.jpeg)
    b.dispose() 
    %>
    
    

    lo richiamo da una pagina asp così: square.aspx?img=immagine.jpg&opx=150

    dove 150 è l'altezza e la lunghezza dell'immagine.


  • User Attivo

    Scusa ma se ho capito bene ti scala l'immagine in proporzione.
    Cioè se tu gli dai un'immagine rettangolare dovrebbe rimanere tale ma rimpicciolita o sbaglio?


  • User Attivo

    Lo script sopra crea un immagine quadrata della dimensione che tu vuoi da qualsiasi immagine, rettangolare o no...effettua il ridimensionamento e taglia il supefluo.

    Vorrei invece che creasse un'immagine rettangolare, secondo te è fattibile?


  • User Attivo

    Ho cambiato i parametri permettendoti di impostare larghezza e altezza.
    Prova un po così ma l'immagine si potrebbe stirare:

    
        Dim strFilename As String
    dim i as System.Drawing.Image
    dim b as System.Drawing.bitmap
    dim g as graphics
    If Left(request.QueryString("img"),4) = "http" then
        'Response.Write("case1<br/>")
        strFilename=server.mappath(right(request.QueryString("img"),len(request.QueryString("img"))-len(Request.ServerVariables("SERVER_NAME"))-7))
    else
        'Response.Write("case2<br/>")
        strFilename =  server.mappath(request.QueryString("img"))
        End If
        
        'Dim h As Integer = Request.QueryString("opx") + 200
        
        i = System.Drawing.Image.FromFile(strFilename)
        b = New System.Drawing.Bitmap(Request.QueryString("w"), Request.QueryString("h"), PixelFormat.Format24bppRgb)
    g = graphics.fromimage(b)
    g.InterpolationMode = 2
    g.SmoothingMode = 4
    g.PixelOffsetMode = 4
    g.CompositingQuality = 4
    
    ? scale and translate the image
    Dim NewLar, NewAlt, SrcX, SrcY
    If i.height>i.width then
        NewLar = i.width
        NewAlt = i.width
        SrcX=0
            SrcY = (((i.Height * Request.QueryString("w")) / i.Width) - Request.QueryString("w")) / 2
    else
        NewLar = i.height
        NewAlt = i.height
        SrcY = 0
            SrcX = (((i.Width * Request.QueryString("h")) / i.Height) - Request.QueryString("h")) / 2
    
        End If
        
        'Response.Write(SrcY & " - " & SrcX)
        
        g.DrawImage(i, New Rectangle(0, 0, Request.QueryString("w"), Request.QueryString("h")), New Rectangle(SrcX, SrcY, NewLar, NewAlt), GraphicsUnit.Pixel)
        'Response.Write(NewLar & " " & NewAlt & " " & SrcX & " " & SrcY)
        Response.ContentType = "image/jpeg"
        b.Save(Response.OutputStream, ImageFormat.Jpeg)
    b.dispose() 
    
    

    L'immagine va richiamata con questi parametri:
    /img.aspx?img=img.gif&w=600&h=300
    Dove w è la larghezza e h l'altezza


  • User Attivo

    Ho provato ma purtroppo l'immagine stira...non viene fatto il ritaglio o crop.

    In pratica è come se mettessi l'immagine in html senza usare asp o asp.net modificando l'altezza e la larghezza.


  • User Attivo

    Ho capito cosa vuoi fare ma mi servirebbe più tempo per ragionarci sopra. C'è bisogno di qualche calcolo ulteriore.

    Se riesco ti faccio sapere. Non ho molto tempo purtroppo


  • User Attivo

    No problem, so benissimo che il tempo è sacro. Appena puoi mi trovi quì.


  • User Attivo

    Stavo abozzando qualcosa ma ho bisogno di un valido aiuto.

    in questo modo l'immagine non è più quadrata ma rettangolare (800x300), riesco ad adattare anche l'immagine (per ora sto facendo prove con immagini di altezza superiore alla larghezza(primo if))...ma se cambio immagine non mi trovo più (è anche ovvio poichè sto usando numeri fissi anzicchè variabili (ad es.: NewLar = opxLARGHEZZA/1.52 invece che NewLar = opxLARGHEZZA/Qualche Formula).

    
    <%@ Page Language="VB"%>
    <%@ import Namespace="System.Drawing"%>
    <%@ import Namespace="System.Drawing.Imaging"%>
    <%@ import Namespace="System.Text.RegularExpressions"%>
    
    <%
    dim strFilename as string
    dim opxLARGHEZZA as string
    dim opxALTEZZA as string
    dim i as System.Drawing.Image
    dim b as System.Drawing.bitmap
    dim g as graphics
    If Left(request.QueryString("img"),4) = "http" then
        'Response.Write("case1<br/>")
        strFilename=server.mappath(right(request.QueryString("img"),len(request.QueryString("img"))-len(Request.ServerVariables("SERVER_NAME"))-7))
    else
        'Response.Write("case2<br/>")
        strFilename = server.mappath(request.QueryString("img"))
    end if
    i = System.Drawing.Image.FromFile(strFilename)
    opxLARGHEZZA="800"
    opxALTEZZA="300"
    b = New system.drawing.bitmap(opxLARGHEZZA, opxALTEZZA, pixelformat.format24bpprgb)
    g = graphics.fromimage(b)
    g.InterpolationMode = 2
    g.SmoothingMode = 4
    g.PixelOffsetMode = 4
    g.CompositingQuality = 4
    
    ? scale and translate the image
    Dim NewLar, NewAlt, SrcX, SrcY
    If i.height>i.width then
        NewLar = opxLARGHEZZA/1.52
        NewAlt = opxALTEZZA/1.52
        SrcX=0
        SrcY = (((i.height*opxALTEZZA)/i.width)-opxALTEZZA)/2
    else
        NewLar = i.height
        NewAlt = i.height
        SrcY = 0
        SrcX = (((i.width*request.QueryString("opx"))/i.height)-request.QueryString("opx"))/2
    
    end if
    g.drawimage(i,New rectangle(0,0,opxLARGHEZZA,opxALTEZZA), New rectangle(SrcX,SrcY,NewLar,NewAlt), GraphicsUnit.Pixel)
    'Response.Write(NewLar & " " & NewAlt & " " & SrcX & " " & SrcY)
    
    Response.ContentType = "image/jpeg"
    b.Save(Response.OutputStream, ImageFormat.Jpeg)
    b.Dispose()
    %>