Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    14

    [c#] interpolazione immagine

    Salve a tutti
    sono alle prime armi con asp.net...
    Il mio problema è che non riesco a utilizzare i parametri di interpolazione per le immagini, cambio le impostazioni di "InterpolationMode" e di tutti i parametri che riguardano la qualità dell'immagine ma il risultato non cambia cioè i bordi di alcuni tratti appaiono seghettati, mentre la compressione ed il ridimensionamento funzionano..
    ecco il codice:
    Codice PHP:
    <%@ Page Language="C#" ContentType="text/html" ResponseEncoding="iso-8859-1"%>
    <%@ 
    import Namespace="System.IO" %>
    <%@ 
    import Namespace="System.Drawing" %>
    <%@ 
    import Namespace="System.Drawing.Imaging" %>
    <%@ 
    import Namespace="System.Drawing.Drawing2D" %>
    <
    script language="C#" runat="server">

    void Page_Load(Object senderEventArgs e) {
            
            
            
    string imageLocation;
            
    bool forceaspect true;
            
    int newHeight;
            
    int newWidth;
            
    int reqHeight 100;
            
    int reqWidth 100;
            
    int origHeight;
            
    int origWidth;
            
    imageLocation Request.QueryString["Image"];
            if (
    Request.QueryString["Height"] != null){
                
    reqHeight Convert.ToInt32(Request.QueryString["Height"]);
            }
            if (
    Request.QueryString["ForceAspect"] != null){
                
    forceaspect Convert.ToBoolean(Request.QueryString["ForceAspect"]);
            }
            if(
    Request.QueryString["Width"] != null){
                
    reqWidth Convert.ToInt32(Request.QueryString["Width"]);
            }
            if (
    Request.QueryString["ForceAspect"] == "true"){
                
    forceaspect true;
            }
            
    System.Drawing.Bitmap origBitmap = new System.Drawing.Bitmap(Server.MapPath(imageLocation));
            
    origHeight origBitmap.Height;
            
    origWidth origBitmap.Width;
            
            if (
    forceaspect){
                
    //Force Aspect Change
                
    newHeight reqHeight;
                
    newWidth reqWidth;
            }        
            else if (
    origBitmap.Width >= origBitmap.Height){
                
    //Portrait
                
    newWidth reqWidth;
                
    newHeight = (int)(((double)origBitmap.Height / (double)origBitmap.Width) * reqWidth);
            }
            else{ 
                
    //Landscape
                
    newWidth reqWidth;
                
    newHeight = (int)(((double)origBitmap.Height / (double)origBitmap.Width) * reqWidth);
            }
            
    origBitmap.Dispose();

        
    ResizeFile(imageLocationnewWidthnewHeight""95);
    }


    private 
    void Resize(Stream imgStrint widthint heightstring FileNameint compression) {

        
    //creo il bitmap dallo stream
        
    System.Drawing.Image bmpStream=System.Drawing.Image.FromStream(imgStr);
            


        
    //creo un nuovo bitmap
        
    Bitmap img;
        

        
    Graphics oGraphic Graphics.FromImage(bmpStream);

        
    oGraphic.CompositingQuality CompositingQuality.HighQuality;
        
    //oGraphic.SmoothingMode = SmoothingMode.HighQuality;
        
    oGraphic.InterpolationMode InterpolationMode.HighQualityBicubic;
        
    oGraphic.PixelOffsetMode PixelOffsetMode.HighQuality
        
    oGraphic.SmoothingMode SmoothingMode.AntiAlias;
        
        
    //se indicato lo ridimensiono
        
    if (width == || height == 0img=new Bitmap(bmpStream);
        else 
    img=new Bitmap(bmpStream,new Size(width,height));
        

            
        
    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(encodercompression);
        
    encoderParameters.Param[0] = encoderParameter;
        
        if (
    FileName == "") {
            
    img.Save(FileNamejpegCodecInfoencoderParameters);
        } else {
            
    Response.ContentType "image/jpeg";
            
    img.Save(Response.OutputStreamjpegCodecInfoencoderParameters);
        }
        
    img.Dispose();
        
    img null;

    }

    private 
    void ResizeFile(string nomefile,int widthint heightstring nuovonomeint compression) {

        
    //carico un'immagine in uno stream
        
    try {
            
    FileStream file=new FileStream(Server.MapPath(nomefile),FileMode.Open);
            
    Resize(file,width,height,Server.MapPath(nuovonome),compression);
            
    file.Close();
        } catch (
    System.IO.FileNotFoundException ex) {
            
    Response.Write("l'immagine non esiste");
        }

    }

    ImageCodecInfo GetEncoderInfo(string mimeType) {
       
    ImageCodecInfo[] encoders ImageCodecInfo.GetImageEncoders();
       for (
    int j 0jencoders.Lengthj++) {
          if (
    encoders[j].MimeType == mimeType) {
               return 
    encoders[j];
          }
       }
       return 
    null;
    }
    </script> 

  2. #2
    Ciao,
    ti incollo il codice che uso io e che risolve il problema della qualità delle immagini ridimensionate con GDI.
    E' scritto in VB.NET invece che in C# ma non dovrebbe essere complicato leggerlo e adattarlo.
    Dalla mia esperienza, ho notato che i parametri come InterpolationMode, SmoothingMode e gli altri parametri del genere, funzionano se utilizzati con il metodo DrawImage
    Codice PHP:
        Public Function ResizeImage(ByVal currentImage As ImageByVal newSize As SizeOptional ByVal MaintainAspect As Boolean True) As Image
            
    If MaintainAspect True Then
                newSize 
    CalculateImageSize(currentImage.SizenewSize)
            
    End If

            
    Dim TargetBitmap As New Bitmap(currentImagenewSize)
            
    Dim TargetGraphic As Graphics Graphics.FromImage(TargetBitmap)

            
    TargetGraphic.InterpolationMode InterpolationMode.HighQualityBicubic
            TargetGraphic
    .SmoothingMode SmoothingMode.HighQuality
            TargetGraphic
    .DrawImage(currentImage, New Rectangle(00newSize.WidthnewSize.Height), 00currentImage.WidthcurrentImage.HeightGraphicsUnit.Pixel)

            
    TargetGraphic.Dispose()
            
    TargetGraphic Nothing

            
    Return TargetBitmap
        End 
    Function

        Public Function 
    CalculateImageSize(ByVal ImageSize As SizeByVal newsize As Size) As Size
            Dim mySize 
    As Size
            Dim rNew 
    As Double
            Dim rCur 
    As Double

            rNew 
    newsize.Width newsize.Height
            rCur 
    ImageSize.Width ImageSize.Height

            
    If rCur rNew Then
                mySize
    .Width newsize.Width
                mySize
    .Height CInt(mySize.Width rCur)
            
    End If

            If 
    rCur rNew Then
                mySize
    .Height newsize.Height
                mySize
    .Width CInt(mySize.Height rCur)
            
    End If

            If 
    rCur rNew Then
                mySize
    .Width newsize.Width
                mySize
    .Height newsize.Height
            End 
    If

            Return 
    mySize
        End 
    Function 
    Se vuoi, puoi dare un'occhiata a questa classe che ho scritto qualche tempo fa e che si occupava proprio di fare questo genere di cose, l'indirizzo è: http://www.artlabs.it/blogs/simone/i...elle-immagini/
    Visual Basic e Dintorni
    Blog sullo sviluppo Web in generale

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    14
    Grazie Simo,
    ho provato con il metodo DrawImage ma niente da fare.. l'immagine rimane "aspra".
    Ho pensato di utilizzare il tuo codice, in quel caso avrei il problema della compressione..

    Cmq grazie per la disponibilità
    saluti

  4. #4
    Originariamente inviato da Istrich
    Ho pensato di utilizzare il tuo codice, in quel caso avrei il problema della compressione..
    Se per il mio codice intendi la classe ArtLabs.Pictures, quella prevede come parametri di ingresso, oltre all'immagine da ridimensionare e alle nuove dimensioni a cui portarla, il rapporto di compressione con cui salvare il file ottenuto.
    Visual Basic e Dintorni
    Blog sullo sviluppo Web in generale

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    14
    Originariamente inviato da simo
    Se per il mio codice intendi la classe ArtLabs.Pictures, quella prevede come parametri di ingresso, oltre all'immagine da ridimensionare e alle nuove dimensioni a cui portarla, il rapporto di compressione con cui salvare il file ottenuto.
    Per il tuo codice intendo quello nel post scritto in "Vb", non la classe.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    14
    Originariamente inviato da simo
    Se per il mio codice intendi la classe ArtLabs.Pictures, quella prevede come parametri di ingresso, oltre all'immagine da ridimensionare e alle nuove dimensioni a cui portarla, il rapporto di compressione con cui salvare il file ottenuto.
    Per il tuo codice intendo quello nel post scritto in "Vb", non la classe.

  7. #7
    Allora il problema della compressione è relativo perchè la devi impostare in fase di salvataggio dell'immagine su disco. La funzione ResizeImage che ho postato ti restituisce un oggetto Image che puoi salvare poi a tuo piacimento.

    Puoi passare per esempio quell'Image alla tua funzione di salvataggio e impostare la compressione che vuoi.
    Visual Basic e Dintorni
    Blog sullo sviluppo Web in generale

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    14
    Originariamente inviato da simo
    Allora il problema della compressione è relativo perchè la devi impostare in fase di salvataggio dell'immagine su disco. La funzione ResizeImage che ho postato ti restituisce un oggetto Image che puoi salvare poi a tuo piacimento.

    Puoi passare per esempio quell'Image alla tua funzione di salvataggio e impostare la compressione che vuoi.
    In pratica non devo salvare l'immagine su disco ma solo visualizzarla tenendo conto di: compressione, ridimensionamento e interpolazione, quest'ultima perchè diversamente alcuni contorni specialmente le linee risultano seghettate. Nel link seguente noterai che il bordo del monitor non è lineare, come se avesse bisogno di un filtro antialiasing.
    http://www.equalsistema.it/thumbnail...uff5febb03.jpg
    Penso che le soluzioni siano due:
    1) utilizzare il mio script cercando in qualche modo di attivare quel maledetto parametro di interpolazione.
    2) integrare nel tuo script "VB" la possibilità di controllare la compressione.
    Tieni presente che in asp.net, sia utilizzando il VB che C# sono scarsissimo..
    saluti

  9. #9
    Ok, ho capito ma mi viene un dubbio?

    Sei sicuro che ti convenga ridimensionare l'immagine ogni volta che viene caricata la pagina?
    Voglio dire, non ti conviene salvare una miniatura la prima volta e poi andare a ricercare sempre quella in una cartella quando viene richiesta, piuttosto che richiedere al server ogni volta di ripetere la stessa operazione?

    Comunque sia, dal tuo codice ho estratto questo porzione:
    Codice PHP:
        if (FileName == "") { 
            
    img.Save(FileNamejpegCodecInfoencoderParameters); 
        } else { 
            
    Response.ContentType "image/jpeg"
            
    img.Save(Response.OutputStreamjpegCodecInfoencoderParameters); 
        } 
    che tu usi per inviare direttamente la foto al browser senza salvarla sul server.

    L'oggetto img, che è quello che ha il metodo save è un bitmap che può essere popolato con un oggetto image proveniente da qualsiasi parte.

    Per far funzionare il parametro di interpolazione, dopo aver sbattuto la testa sul monitor diverse ore, ho scoperto che (non chiedermi perchè) mi funzionava solo (o almeno è stato l'unico modo che ho trovato io per farlo funzionare), usando il metodo DrawImage come vedi qui sotto:
    Codice PHP:
    DrawImage(currentImage, New Rectangle(00newSize.WidthnewSize.Height), 00currentImage.WidthcurrentImage.HeightGraphicsUnit.Pixel
    No so perchè, ma se non uso New Rectangle e gli esatti parametri che ti ho postato, l'interpolazione viene fatta sempre con il metodo lineare.

    Spero di esserti stato utile
    Ciao
    Visual Basic e Dintorni
    Blog sullo sviluppo Web in generale

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    14
    Ho utilizzato il metodo drawImage ma niente da fare non cambia di una virgola, anche modificando i parametri di DrawImage tipo dimensione del rettangolo, Point x e y.
    ecco il codice
    Codice PHP:
    <%@ Page Language="C#" ContentType="text/html" ResponseEncoding="iso-8859-1"%>
    <%@ 
    import Namespace="System.IO" %>
    <%@ 
    import Namespace="System.Drawing" %>
    <%@ 
    import Namespace="System.Drawing.Imaging" %>
    <%@ 
    import Namespace="System.Drawing.Drawing2D" %>
    <
    script language="C#" runat="server">

    void Page_Load(Object senderEventArgs e) {
            
            
    string imageLocation;
            
    bool forceaspect true;
            
    int newHeight;
            
    int newWidth;
            
    int reqHeight 100;
            
    int reqWidth 100;
            
    int origHeight;
            
    int origWidth;
            
    imageLocation Request.QueryString["Image"];
            if (
    Request.QueryString["Height"] != null){
                
    reqHeight Convert.ToInt32(Request.QueryString["Height"]);
            }
            if (
    Request.QueryString["ForceAspect"] != null){
                
    forceaspect Convert.ToBoolean(Request.QueryString["ForceAspect"]);
            }
            if(
    Request.QueryString["Width"] != null){
                
    reqWidth Convert.ToInt32(Request.QueryString["Width"]);
            }
            if (
    Request.QueryString["ForceAspect"] == "true"){
                
    forceaspect true;
            }
            
    System.Drawing.Bitmap origBitmap = new System.Drawing.Bitmap(Server.MapPath(imageLocation));
            
    origHeight origBitmap.Height;
            
    origWidth origBitmap.Width;
            
            if (
    forceaspect){
                
    //Force Aspect Change
                
    newHeight reqHeight;
                
    newWidth reqWidth;
            }        
            else if (
    origBitmap.Width >= origBitmap.Height){
                
    //Portrait
                
    newWidth reqWidth;
                
    newHeight = (int)(((double)origBitmap.Height / (double)origBitmap.Width) * reqWidth);
            }
            else{ 
                
    //Landscape
                
    newWidth reqWidth;
                
    newHeight = (int)(((double)origBitmap.Height / (double)origBitmap.Width) * reqWidth);
            }
            
    origBitmap.Dispose();

        
    ResizeFile(imageLocationnewWidthnewHeight""95);
    }


    private 
    void Resize(Stream imgStrint widthint heightstring FileNameint compression) {

        
    //creo il bitmap dallo stream
        
    System.Drawing.Image bmpStream=System.Drawing.Image.FromStream(imgStr);
            


        
    //creo un nuovo bitmap
        
    Bitmap img;
        


        
    //se indicato lo ridimensiono
        
    if (width == || height == 0img=new Bitmap(bmpStream);
        else 
    img=new Bitmap(bmpStream,new Size(width,height));
        
        
        
    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(encodercompression);
        
    encoderParameters.Param[0] = encoderParameter;
        
        
    Graphics oGraphic Graphics.FromImage(img);

        
    oGraphic.CompositingQuality CompositingQuality.HighQuality;
        
    oGraphic.SmoothingMode SmoothingMode.HighQuality;
        
    oGraphic.InterpolationMode InterpolationMode.HighQualityBicubic;
        
    oGraphic.PixelOffsetMode PixelOffsetMode.HighQuality
        
    //oGraphic.SmoothingMode = SmoothingMode.AntiAlias;
        
    oGraphic.DrawImageimg, new Rectangle(00widthheight), 00widthheightGraphicsUnit.Pixel);

        if (
    FileName == "") {
            
    img.Save(FileNamejpegCodecInfoencoderParameters);
        } else {
            
    Response.ContentType "image/jpeg";
            
    img.Save(Response.OutputStreamjpegCodecInfoencoderParameters);
        }
        
    img.Dispose();
        
    img null;

    }

    private 
    void ResizeFile(string nomefile,int widthint heightstring nuovonomeint compression) {

        
    //carico un'immagine in uno stream
        
    try {
            
    FileStream file=new FileStream(Server.MapPath(nomefile),FileMode.Open);
            
    Resize(file,width,height,Server.MapPath(nuovonome),compression);
            
    file.Close();
        } catch (
    System.IO.FileNotFoundException ex) {
            
    Response.Write("l'immagine non esiste");
        }

    }

    private 
    ImageCodecInfo GetEncoderInfo(string mimeType) {
       
    ImageCodecInfo[] encoders ImageCodecInfo.GetImageEncoders();
       for (
    int j 0jencoders.Lengthj++) {
          if (
    encoders[j].MimeType == mimeType) {
               return 
    encoders[j];
          }
       }
       return 
    null;
    }
    </script> 

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 © 2026 vBulletin Solutions, Inc. All rights reserved.