Ladda upp bild samt förminska den

by Reager 15. August 2007 18:30

I denna artikel så tänkte jag visa hur man enkelt laddar upp en bild samt skapar en thumbnail av den i ASP.NET

Det första vi ska göra är att skapa ett nytt webbprojekt. I detta webbprojekt så ska det finnas en katalog som heter images och i denna katalog ska du skapa en katalog som heter thumbs. Glöm inte att sätta skrivrättigheter på dessa mappar.  Sedan ska du dra ut de kontroller vi kommer att använda. Dessa kontroller listas nedan

  1. <asp:FileUpload ID="fuImage" runat="server" /><asp:Button ID="btnUpload" runat="server" Text="Ladda upp" />
  2. <br />
  3. <asp:Label ID="lblStatusMessage" runat="server"></asp:Label>

Som du kanske ser så har inte våran knapp något Click-event, och något sådant behövs heller inte utan att sköts
via Page_Load.

Om vi går till Code-läget och hoppar till page-load så är det första vi ska göra att kolla om det är en Postback samt
om våran fileupload innehåller någon fil. Detta görs genom följande kodrader

  1. // Börja med att kolla om det är en Postback
  2.         if (IsPostBack)
  3.         {
  4.             // Om det är en postback så kollar vi om vi har en fil
  5.             // Har vi det så tar vi hand om den
  6.             if (fuImage.HasFile)
  7.             {

Som du ser så är det inga konstigheter här, utan vi kollar först om det är en Postback och sedan om vi har en fil på ingång.
Eftersom vi inte vill tillåta annat än bilder så kontrollerar vi detta

  1.                 // Vi tar med hjälp av metoden GetExtension reda på vilken filtyp
  2.                 // det är då vi vill ha möjlighet att begränsa filtyperna till olika
  3.                 // bildformat då det är bilduppladdning vi håller på med. För att förenkla
  4.                 // kollen senare av filändelsen så gör vi om den så att den bara innehåller
  5.                 // små bokstäver med hjälp av metoden ToLower()
  6.                 String extension = System.IO.Path.GetExtension(fuImage.FileName).ToLower();
  7.                 // Sedan skapar vi en array med de filtyper som vi vill godkänna
  8.                 String[] extensions = { ".gif", ".jpeg", ".jpg" };
  9.                
  10.                 // Denna variabel sätts till true om det är en tillåten filtyp vi har att göra
  11.                 // med.
  12.                 bool allowed = false;
  13.                 // Vi loopar igenom våran array med tillåtna filändelser                
  14.                 foreach (String ex in extensions)
  15.                 {
  16.                     // Om vi får en match betyder det att våran fil är tillåten och allowed sätts till true
  17.                     if (ex.Equals(extension))
  18.                         allowed = true;
  19.                 }

Koden förklarar sig självt väldigt bra tycker jag och vi hoppar direkt till nästa del, vilken tar upp själva sparandet av filen samt
skapandet av thumbnailen.

  1.                 // Nu kollar vi om det var en tillåten fil vi hade sparar vi den
  2.                 // i mappen images, annars skriver vi bara ut ett felmeddelande
  3.                 if (allowed)
  4.                 {
  5.                     // Vi sparar våran filnamn i en variabel innan vi använder den då vi
  6.                     // vill använda den för att förminska bilden. Guid.NewGuid skapar ett så
  7.                     //gott som unikt värde som kan användas då man behöver unika namn.
  8.                     String filename = Guid.NewGuid() + extension;
  9.                     // Sparar filen,
  10.                     fuImage.SaveAs(Server.MapPath("images/") + filename);
  11.                     // Efter att bilden är sparad så ska vi förminska den
  12.                     // Vi börjar med att ladda in våran bild i ett Image-objekt
  13.                     // med hjälp av den den InputStream som vi får av upload-kontroll
  14.                     System.Drawing.Image imgImage = Bitmap.FromStream(fuImage.PostedFile.InputStream);
  15.                     // För att våran bild ska ha de rätta proportionerna även efter
  16.                     // förminskningen så tar vi ut höjd samt bredd från orginalbilden.
  17.                     int height, width;
  18.                     // Vi tar ut höjden och bredden från orginalbilden för att
  19.                     // kunna kontrollera den.
  20.                     height = imgImage.Height;
  21.                     width = imgImage.Width;
  22.                     // Här bestämmer jag att maximala höjden på den nya bilden ska vara 120 pixlar.
  23.                     if (height > 120)
  24.                     {
  25.                         // Vi sätter bredden till 120* förhållandet mellan bredd & höjd på orginalbilden
  26.                         width = 120 * width / height;
  27.                         height = 120;
  28.                     }
  29.                     // Skapar våran thumbnail från orginalbilden med de nya värdena
  30.                     imgImage = imgImage.GetThumbnailImage(width, height, null, System.IntPtr.Zero);
  31.                     // Sedan sparar vi denna bild med samma namn som orginalet i katalogen thumbs som återfinns i mappen images
  32.                     imgImage.Save(Server.MapPath("images/thumbs/") + filename);
  33.                     // Sist men absolut inte minst så förstör vi våra objekt för att frigöra minnet
  34.                     imgImage.Dispose();
  35.                     fuImage.Dispose();
  36.                     // Talar om att allt gick som det skulle samt visar thumbnailen
  37.                     lblStatusMessage.Text = "Bild uppladdad och thumbnail skapad <img src=\"images\\thumbs\\" + filename + "\">";
  38.                 }
  39.                 else
  40.                     lblStatusMessage.Text = "Otillåten filtyp.";
  41.                    
  42.             }
  43.         }

Så enkelt var det att i ASP.NET både ladda upp en bild och skapa en thumbnail. Hur du väljer att presentera de uppladdade bilderna tänkte jag låta vara upp till dig. För att du ska kunna testa så finns som vanligt möjlighet att ladda ner hela projektet samt att testa det live direkt här.

Demo: http://aspdotnet.nu/upload/demo/ImageUploadWithResize/
Script: http://aspdotnet.nu/upload/script/ImageUploadWithResize.rar

Tags: , , ,

ASP.NET | C# | Artikel

Comments

1/26/2008 6:57:54 PM #

Johan Karlsson

Hej! Tack för bra tips! Upptäckte dock att jag fick bygga ut koden lite eftersom GetThumbnailImage inte ger bra resultat om man vill ha en lite större bild än ca 120 pixlar.
Så har kan man göra för att få bättre kvalitet:

    private System.Drawing.Image resizeImage(System.Drawing.Image img, int width, int height)
    {
        Bitmap bitmap = new Bitmap(width, height);
        Graphics g = Graphics.FromImage((System.Drawing.Image)bitmap);
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        g.DrawImage(img, 0, 0, width, height);
        g.Dispose();

        return (System.Drawing.Image)bitmap;
    }


När det gäller att spara bilden som en fil blir den onödigt stor om man inte skickar med en parameter och talar om hur den ska komprimeras, t ex så här (klippt från olika forum på nätet):

    private void SaveJPGWithCompressionSetting(System.Drawing.Image image, string szFileName, long lCompression)
    {
        EncoderParameters eps = new EncoderParameters(1);
        eps.Param[0] = new EncoderParameter(Encoder.Quality, lCompression);
        ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
        image.Save(szFileName, ici, eps);
    }

    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }

Vid anrop väljer man önskad kvalitet med den sista parametern mellan 1 coh 100(? tror jag)'

                SaveJPGWithCompressionSetting(imgImage, Server.MapPath(imgCtrl.ImageUrl), 60);


DVS här valde jag 60% kvalitet. Filstorleken minskar väsentligt på detta sätt!

Ha det gott!

Johan Karlsson Sweden

2/10/2008 9:40:27 PM #

Ernesto

Hej !

Tack för tipsen, hur kallar man sedan på thumbnailen på exempelvis en sida där
jag vill visa produkter? Vad är koden?

Ernesto

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading



Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

RecentComments

Comment RSS