Avatar billede weis Nybegynder
20. juni 2008 - 11:06 Der er 2 kommentarer og
1 løsning

crop on the fly

Jeg har et billede liggende på serveren og så har jeg en side som skal vise det billede, men siden skal kun vise en del af billedet og jeg kender mine start x og y punkter samt breden og højden, er det så muligt at crop billedet on the fly så det kun er brugerens billede der bliver skåret i (uden at gemme en kopi på serveren) og hvis det er muligt, kan det så rent performance betale sig. (skal lige siges at billedet skal bruges i andre sammenhænge hvor det er andre koordinater og størrelser af billedet)
Avatar billede driis Nybegynder
20. juni 2008 - 18:32 #1
For hver version (størrelse + x,y startpunkt kombination) ville jeg nok vælge at gemme en kopi i database eller filsystem, så cropping kun skal ske én gang.

Du kan vælge enten at gemme det genererede billede på disk og så bare give brugeren URL til det. Eller, du kan skrive en IHttpHandler som server billedet for dig (primært hvis du ikke er interesseret i at have billedet liggende på disken).
Avatar billede driis Nybegynder
20. juni 2008 - 19:14 #2
Her er et rigtigt simpelt eksempel på cropping. Det kan faktisk gøres i én linie kode, metoden CropImage. Jeg har medtaget IHttpHandler delen; så det skulle være klart til at køre. Hvis man kører denne http handler med 5 parametre i querystring, sti til filen (path) samt dimensioner, sendes det croppede billede til browseren.

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;

namespace TestImageCrop
{
    public class ImageHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            try
            {
                var query = context.Request.QueryString;
                string path = query["path"];
                var img = new Bitmap(context.Server.MapPath(path));
                int x, y, w, h;
                if (
                    int.TryParse(query["x"], out x) &&
                    int.TryParse(query["y"], out y) &&
                    int.TryParse(query["w"], out w) &&
                    int.TryParse(query["h"], out h))
                {
                    img = CropImage(img, x, y, w, h);
                    context.Response.ContentType = "image/jpeg";
                    img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                }
                else
                    throw new ApplicationException("Invalid parameters.");
            }
            catch(Exception ex)
            {
                context.Response.ContentType = "text/plain";
                context.Response.StatusCode = 500;               
                context.Response.Write(ex.Message + Environment.NewLine);
                context.Response.Write(ex.StackTrace);
            }
        }

        private Bitmap CropImage(Bitmap img, int x, int y, int w, int h)
        {
            return img.Clone(new Rectangle(x, y, w, h), PixelFormat.Format32bppRgb);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}
Avatar billede weis Nybegynder
22. juni 2008 - 07:44 #3
Okay, så gemmer jeg en kopi hver gang billedet bliver klippet til!
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