Avatar billede suned Nybegynder
28. marts 2003 - 09:25 Der er 11 kommentarer og
1 løsning

Upload og skalering af billede med .net

Jeg har lavet den funktion der uploader et billede ved brug af .net. herefter skal billedet skaleres så det passer i den visning jeg har lavet. Efter denne skalering er billedet meget utydeligt. Hvad skyldes?
Avatar billede guidmaster Nybegynder
28. marts 2003 - 09:39 #1
Det kommer helt an på hvordan din skalering laves. Hvis du bruger GetThumbnailImage vil du ofte få denne fejl. Det skyldes at den tager et indlejret Thumbnail som ligger i billedet.
Avatar billede suned Nybegynder
28. marts 2003 - 10:15 #2
Det er GetThumbnailImage jeg benytter. Er der andre bedre muligheder?
Avatar billede askhoej Praktikant
28. marts 2003 - 10:36 #3
Jeg har engang downloadet et eksempel til skalering af billeder, jeg kan desværre ikke huske hvor jeg downloade det - men her er koden. Jeg har selv brugt koden med succes :-)

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Tutorial
{
    class ImageResize
    {
        enum Dimensions
        {
            Width,
            Height
        }
        enum AnchorPosition
        {
            Top,
            Center,
            Bottom,
            Left,
            Right
        }
        [STAThread]
        static void Main(string[] args)
        {
            //set a working directory
            string WorkingDirectory = @"C:\Projects\Tutorials\ImageResize";

            //create a image object containing a verticel photograph
            Image imgPhotoVert = Image.FromFile(WorkingDirectory + @"\imageresize_vert.jpg");
            Image imgPhotoHoriz = Image.FromFile(WorkingDirectory + @"\imageresize_horiz.jpg");
            Image imgPhoto = null;

            imgPhoto = ScaleByPercent(imgPhotoVert, 50);
            imgPhoto.Save(WorkingDirectory + @"\images\imageresize_1.jpg", ImageFormat.Jpeg);
            imgPhoto.Dispose();

            imgPhoto = ConstrainProportions(imgPhotoVert, 200, Dimensions.Width);
            imgPhoto.Save(WorkingDirectory + @"\images\imageresize_2.jpg", ImageFormat.Jpeg);
            imgPhoto.Dispose();

            imgPhoto = FixedSize(imgPhotoVert, 200, 200);
            imgPhoto.Save(WorkingDirectory + @"\images\imageresize_3.jpg", ImageFormat.Jpeg);
            imgPhoto.Dispose();

            imgPhoto = Crop(imgPhotoVert, 200, 200, AnchorPosition.Center);
            imgPhoto.Save(WorkingDirectory + @"\images\imageresize_4.jpg", ImageFormat.Jpeg);
            imgPhoto.Dispose();

            imgPhoto = Crop(imgPhotoHoriz, 200, 200, AnchorPosition.Center);
            imgPhoto.Save(WorkingDirectory + @"\images\imageresize_5.jpg", ImageFormat.Jpeg);
            imgPhoto.Dispose();

        }
        static Image ScaleByPercent(Image imgPhoto, int Percent)
        {
            float nPercent = ((float)Percent/100);

            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;

            int destX = 0;
            int destY = 0;
            int destWidth  = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(imgPhoto,
                new Rectangle(destX,destY,destWidth,destHeight),
                new Rectangle(sourceX,sourceY,sourceWidth,sourceHeight),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            return bmPhoto;
        }
        static Image ConstrainProportions(Image imgPhoto, int Size, Dimensions Dimension)
        {
            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;
            int destX = 0;
            int destY = 0;
            float nPercent = 0;

            switch(Dimension)
            {
                case Dimensions.Width:
                    nPercent = ((float)Size/(float)sourceWidth);
                    break;
                default:
                    nPercent = ((float)Size/(float)sourceHeight);
                    break;
            }
               
            int destWidth  = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(imgPhoto,
            new Rectangle(destX,destY,destWidth,destHeight),
            new Rectangle(sourceX,sourceY,sourceWidth,sourceHeight),
            GraphicsUnit.Pixel);

            grPhoto.Dispose();
            return bmPhoto;
        }

        static Image FixedSize(Image imgPhoto, int Width, int Height)
        {
            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;
            int destX = 0;
            int destY = 0;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;

            nPercentW = ((float)Width/(float)sourceWidth);
            nPercentH = ((float)Height/(float)sourceHeight);

            //if we have to pad the height pad both the top and the bottom
            //with the difference between the scaled height and the desired height
            if(nPercentH < nPercentW)
            {
                nPercent = nPercentH;
                destX = (int)((Width - (sourceWidth * nPercent))/2);
            }
            else
            {
                nPercent = nPercentW;
                destY = (int)((Height - (sourceHeight * nPercent))/2);
            }
       
            int destWidth  = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.Clear(Color.Red);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(imgPhoto,
                new Rectangle(destX,destY,destWidth,destHeight),
                new Rectangle(sourceX,sourceY,sourceWidth,sourceHeight),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            return bmPhoto;
        }
        static Image Crop(Image imgPhoto, int Width, int Height, AnchorPosition Anchor)
        {
            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;
            int destX = 0;
            int destY = 0;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;

            nPercentW = ((float)Width/(float)sourceWidth);
            nPercentH = ((float)Height/(float)sourceHeight);

            if(nPercentH < nPercentW)
            {
                nPercent = nPercentW;
                switch(Anchor)
                {
                    case AnchorPosition.Top:
                        destY = 0;
                        break;
                    case AnchorPosition.Bottom:
                        destY = (int)(Height - (sourceHeight * nPercent));
                        break;
                    default:
                        destY = (int)((Height - (sourceHeight * nPercent))/2);
                        break;
                }               
            }
            else
            {
                nPercent = nPercentH;
                switch(Anchor)
                {
                    case AnchorPosition.Left:
                        destX = 0;
                        break;
                    case AnchorPosition.Right:
                        destX = (int)(Width - (sourceWidth * nPercent));
                        break;
                    default:
                        destX = (int)((Width - (sourceWidth * nPercent))/2);
                        break;
                }           
            }

            int destWidth  = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(imgPhoto,
                new Rectangle(destX,destY,destWidth,destHeight),
                new Rectangle(sourceX,sourceY,sourceWidth,sourceHeight),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            return bmPhoto;
        }
    }
}


/Askhoej
Avatar billede askhoej Praktikant
28. marts 2003 - 10:37 #4
Brug denne her til at skalere med:

static Image Crop(Image imgPhoto, int Width, int Height, AnchorPosition Anchor)
Avatar billede suned Nybegynder
31. marts 2003 - 08:47 #5
takker for det hurtige og brugbare svar. Jeg benytter godtnok vb, men efter en mindre omskrivning virker det fint.
Avatar billede clausjul Nybegynder
12. juni 2003 - 21:19 #6
Hvordan kan man få System.Drawing.Image konverteret til System.Web.UI.WebControls.Image?
Avatar billede burningice Nybegynder
13. juni 2003 - 09:29 #7
clausjul>> eeeh... det gør man ikke... System.Web.UI.WebControls.Image svarer til en <img src=""> som html
Avatar billede clausjul Nybegynder
13. juni 2003 - 09:36 #8
Det jeg ville gøre er at skalere billedet før det kommer ud på websiden. Derfor skal billedet egentlig være af type System.Web.UI.WebControls.Image..
Avatar billede burningice Nybegynder
13. juni 2003 - 16:38 #9
clausjul>> for fanden... System.Web.UI.WebControls.Image er ikke noget billede !!

du skal istedet henvise til din aspx-side som laver billedet:

<img src="resize.aspx?image=hej.jpg" />
Avatar billede clausjul Nybegynder
13. juni 2003 - 16:56 #10
OK! Jeg var bare lidt forvirret over System.Drawing.Image og System.Web.UI.WebControls.Image - men nu har jeg fast grund under fødderne ;-)
Avatar billede burningice Nybegynder
14. juni 2003 - 13:26 #11
det er måske heller ikke det smarteste at klasserne hedder det samme :/

en tommelfingerregel er, at klasserne i webcontrols-namespacet producerer almindelig HTML/Javasscript-kode når siden bliver sendt til klienten, så hvis det du har gang i ikke kan lade sig gøre på en .html-side, så kan de klasser ikke hjælpe dig.
Avatar billede burningice Nybegynder
14. juni 2003 - 13:27 #12
pointen: du kan ikke skalere et billede (ikke på pixel-niveau i hvert fald) på en html-side
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