20. juni 2008 - 11:06Der 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)
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).
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; } } } }
Okay, så gemmer jeg en kopi hver gang billedet bliver klippet til!
Synes godt om
Ny brugerNybegynder
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.