Avatar billede c-sharp Nybegynder
26. januar 2004 - 15:03 Der er 20 kommentarer og
3 løsninger

Resize i asp.net

Hvordan kan jeg resize et billede i asp.net?
Avatar billede burningice Nybegynder
26. januar 2004 - 15:14 #1
det her er da en måde at gøre det på:

using System;
using System.Drawing;

namespace MPAConsult.ToolBox.Web
{
    /// <summary>
    /// Summary description for ImageUtil.
    /// </summary>
    public class ImageUtil
    {
        public static Bitmap Resize(Bitmap b, int nWidth, int nHeight, bool bBilinear)
        {
            Bitmap bTemp = (Bitmap)b.Clone();
            b = new Bitmap(nWidth, nHeight, bTemp.PixelFormat);

            double nXFactor = (double)bTemp.Width/(double)nWidth;
            double nYFactor = (double)bTemp.Height/(double)nHeight;

            if (bBilinear)
            {
                double fraction_x, fraction_y, one_minus_x, one_minus_y;
                int ceil_x, ceil_y, floor_x, floor_y;
                Color c1 = new Color();
                Color c2 = new Color();
                Color c3 = new Color();
                Color c4 = new Color();
                byte red, green, blue;

                byte b1, b2;

                for (int x = 0; x < b.Width; ++x)
                    for (int y = 0; y < b.Height; ++y)
                    {
                        // Setup

                        floor_x = (int)Math.Floor(x * nXFactor);
                        floor_y = (int)Math.Floor(y * nYFactor);
                        ceil_x = floor_x + 1;
                        if (ceil_x >= bTemp.Width) ceil_x = floor_x;
                        ceil_y = floor_y + 1;
                        if (ceil_y >= bTemp.Height) ceil_y = floor_y;
                        fraction_x = x * nXFactor - floor_x;
                        fraction_y = y * nYFactor - floor_y;
                        one_minus_x = 1.0 - fraction_x;
                        one_minus_y = 1.0 - fraction_y;

                        c1 = bTemp.GetPixel(floor_x, floor_y);
                        c2 = bTemp.GetPixel(ceil_x, floor_y);
                        c3 = bTemp.GetPixel(floor_x, ceil_y);
                        c4 = bTemp.GetPixel(ceil_x, ceil_y);

                        // Blue
                        b1 = (byte)(one_minus_x * c1.B + fraction_x * c2.B);

                        b2 = (byte)(one_minus_x * c3.B + fraction_x * c4.B);
                       
                        blue = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                        // Green
                        b1 = (byte)(one_minus_x * c1.G + fraction_x * c2.G);

                        b2 = (byte)(one_minus_x * c3.G + fraction_x * c4.G);
                       
                        green = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                        // Red
                        b1 = (byte)(one_minus_x * c1.R + fraction_x * c2.R);

                        b2 = (byte)(one_minus_x * c3.R + fraction_x * c4.R);
                       
                        red = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                        b.SetPixel(x,y, System.Drawing.Color.FromArgb(255, red, green, blue));
                    }
            }
            else
            {
                for (int x = 0; x < b.Width; ++x)
                    for (int y = 0; y < b.Height; ++y)
                        b.SetPixel(x, y, bTemp.GetPixel((int)(Math.Floor(x * nXFactor)),(int)(Math.Floor(y * nYFactor))));
            }

            return b;
        }
    }
}
Avatar billede odegaard Nybegynder
26. januar 2004 - 18:00 #2
Du kan bruge denne til at resize. Den gør det noget bedre end GetThumbnail() funktionen, som er indbygget i .NET

private static Bitmap Resize(Bitmap b, int MaxHeight, int MaxWidth)
{
  int nWidth = b.Width;
  int nHeight = b.Height;
  if(nHeight>MaxHeight) {
      nWidth = (int)((((double)b.Width)/((double)b.Height))*((double)MaxHeight));       
      nHeight = MaxHeight;
  }
  if(nWidth>MaxWidth) {
      nWidth=MaxWidth;
      nHeight = (int)((((double)b.Height)/((double)b.Width))*((double)MaxWidth));
  }
  Bitmap bTemp = (Bitmap)b.Clone();
  b = new Bitmap(nWidth, nHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  double nXFactor = (double)bTemp.Width/(double)nWidth;
  double nYFactor = (double)bTemp.Height/(double)nHeight;
  for (int x = 0; x < b.Width; ++x)
      for (int y = 0; y < b.Height; ++y)
        b.SetPixel(x, y, bTemp.GetPixel((int)(Math.Floor(x * nXFactor)),(int)(Math.Floor(y * nYFactor))));
  return b;
}
Avatar billede odegaard Nybegynder
26. januar 2004 - 18:03 #3
ved nærmere eftersyn så er koden i bund og grund den samme som cyberfessor (altså nearest-neighbour-resampling metoden).

Der er dog en fejl i Cyberfessors kode så vidt jeg kan se. Parser du et ikke-24bit billede til funktionen, fejler den da Bitmap.SetPixel kun virker på 24bit billeder.
Avatar billede c-sharp Nybegynder
26. januar 2004 - 21:58 #4
Hvordan får jeg lagt det retunerede bitmap billede i en fil?
Avatar billede odegaard Nybegynder
27. januar 2004 - 01:07 #5
Fx.
b.Save("C:/filnavn.jpg",ImageFormat.Jpeg);
Avatar billede c-sharp Nybegynder
27. januar 2004 - 06:59 #6
Det virker ikke helt for mig, jeg har skrevet følgende:

Bitmap billedeBitmap = new Bitmap(Server.MapPath("/brugere/"+ Session["kundenr"] + "/" + filnavn));

Bitmap billedeTmp = resize(billedeBitmap,75,75);

billedeTmp.Save(Server.MapPath("/brugere/"+ Session["kundenr"] + "/" + filnavn),ImageFormat.Jpeg); //Det er denne linie den siger der er fejl i!

Og får følgende fejl:
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
Avatar billede burningice Nybegynder
27. januar 2004 - 08:05 #7
vb-begynder>> har du prøvet at bruge den algoritme jeg kom med?
Avatar billede burningice Nybegynder
27. januar 2004 - 08:05 #8
hm.. glem det... det er åbenbart ikke algoritmen den er gal med

tjek at du har skriverettigheder til mappen hvor du prøver at gemme billedet.
Avatar billede c-sharp Nybegynder
27. januar 2004 - 08:30 #9
Jeg kan fint få lov til at gemme billedet hvis jeg ikke resizer det, så jeg må da have skrive rettigheder.
Avatar billede burningice Nybegynder
27. januar 2004 - 08:36 #10
hm.. kay... har du så prøvet med den anden algoritme så ?
Avatar billede c-sharp Nybegynder
27. januar 2004 - 08:47 #11
Har nu prøvet de anden algoritme og får samme fejl.
Avatar billede odegaard Nybegynder
27. januar 2004 - 10:33 #12
100% sikker på du har skriverettigheder? Det er præcis den fejl man får når der ikke er skriverettighed.
Avatar billede c-sharp Nybegynder
27. januar 2004 - 16:17 #13
Jeg har givet Internetgæstekonto alle rettigheder!

Der er heller ingen problemer med at gemme filer jeg uploader uden at resize dem.
Avatar billede odegaard Nybegynder
27. januar 2004 - 17:03 #14
jeg tænkte nu mere på om du har filen åben i en anden process.
Avatar billede c-sharp Nybegynder
29. januar 2004 - 06:34 #15
Cyberfessor smid et svar så du også kan få del i pointne!

Og så mange tak for hjælpen til jer begge!
Avatar billede odegaard Nybegynder
29. januar 2004 - 10:19 #16
fik du det til at virke ?
Avatar billede c-sharp Nybegynder
29. januar 2004 - 10:22 #17
Jep
Avatar billede burningice Nybegynder
29. januar 2004 - 11:58 #18
hvad var der galt?
Avatar billede c-sharp Nybegynder
29. januar 2004 - 12:06 #19
Jeg tror probemet var at jeg ville gemme billede i samme fil efter den var blevet resized, det kan man åbenbart ikke.
Avatar billede burningice Nybegynder
29. januar 2004 - 12:24 #20
:) nope, .Net har det jo stadigvæk... du bliver nødt til at kalde .Dispose() på billedet først, for at frigive det fra hukommelsen
Avatar billede c-sharp Nybegynder
30. januar 2004 - 22:00 #21
Burde jeg så ikke kunne gøre følgende:

Bitmap billedeBitmap = new Bitmap(Server.MapPath("/brugere/"+ Session["kundenr"] + "/" + filnavn));
Bitmap billedeTmp = Resize(billedeBitmap,150,150);
billedeBitmap.Dispose();   
billedeTmp.Save(Server.MapPath("/brugere/"+ Session["kundenr"] + "/" + filnavn),ImageFormat.Jpeg);

Det virker bare ikke rigtig for mig.
Avatar billede burningice Nybegynder
02. februar 2004 - 13:00 #22
jo... i teorien.. i praksis er det dog ikke til at vide helt hvornår at billedet bliver frigivet på grund af .Net's Garbage Collection... det er noget med at du kan tvinge GC'en til at collecte med det samme ved hjælp af Collect-metoden:

Bitmap billedeBitmap = new Bitmap(Server.MapPath("/brugere/"+ Session["kundenr"] + "/" + filnavn));
Bitmap billedeTmp = Resize(billedeBitmap,150,150);
billedeBitmap.Dispose();

GC.Collect();

billedeTmp.Save(Server.MapPath("/brugere/"+ Session["kundenr"] + "/" + filnavn),ImageFormat.Jpeg);
Avatar billede c-sharp Nybegynder
02. februar 2004 - 22:25 #23
Så blev jeg det kloger, nu virker det som det skal!

Tusind tak for hjælpen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester