Avatar billede innercitydk Nybegynder
09. juni 2006 - 13:07 Der er 2 kommentarer og
1 løsning

Skalering af billede der skalerer efter billedets skala

Jeg har et problem med skalering af billeder i forbindelse med upload til server. Hvis billedet er større end 800x600 skaleres det til denne størrelse, men det ødelægger ofte størrelsesforholdet hvis billedets skalering i forvejen ikke er i forholdet 2:3. Jeg vil gerne hvis koden kan moddes så billedet skaleres efter de forhold den har, og ligger og ligger nærmest 800x600 størrelses mæssigt (kbyte).

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 nielle Nybegynder
09. juni 2006 - 15:36 #1
Du bør beregne skalerings-faktoren på både højde og bredde før at du resizer. Når du kender negge to værdier, så vælger du den mindste af dem og ganger denne på både højde og bredde.

At skrive pixel-for-pixel er ikke den mest effektive metode; Dels tager det længere tid, og dels bliver resultatet ikke nødvendigvis specielt kønt (der bør vælges en pænere interpolering):

Et eksempel på hvordan det kunne se ud (tilpasset fra kode fundet på http://www.codeproject.com/csharp/imageresize.asp):

        public Bitmap ResizeBitmap(Bitmap bitmapOrig, int maxHeight, int maxWidth)
        {
            int resizeWidth = bitmapOrig.Width;
            int resizeHeight = bitmapOrig.Height;

            double faktor = 1D;
            if (resizeHeight > maxHeight)
            {
                faktor = 1.0 * maxHeight / resizeHeight;
            }
            else if (resizeWidth > maxWidth)
            {
                double faktor2 = 1.0 * maxWidth / resizeWidth;
                if (faktor2 < faktor) faktor = faktor2;
            }

            if (faktor < 1D)
            {
                resizeHeight = (int)(faktor * resizeHeight);
                resizeWidth = (int)(faktor * resizeWidth);

                Bitmap bitmapResize = new Bitmap(resizeWidth, resizeHeight, PixelFormat.Format24bppRgb);
                bitmapResize.SetResolution(bitmapOrig.HorizontalResolution, bitmapOrig.VerticalResolution);

                using (Graphics grBitmapResize = Graphics.FromImage(bitmapResize))
                {
                    grBitmapResize.InterpolationMode = InterpolationMode.HighQualityBicubic;

                    grBitmapResize.DrawImage(bitmapOrig,
                        new Rectangle(0, 0, resizeWidth, resizeHeight),
                        new Rectangle(0, 0, bitmapOrig.Width, bitmapOrig.Height),
                        GraphicsUnit.Pixel);
                }

                return bitmapResize;
            }
            else
                return bitmapOrig;
        }
Avatar billede innercitydk Nybegynder
10. juni 2006 - 09:44 #2
Det virker logisk :) Smid et svar nielle..
Avatar billede nielle Nybegynder
10. juni 2006 - 09:54 #3
Svar :^)
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