2011-09-06 12 views
15

C'è un modo semplice e dinamico per creare miniature e ridimensionare le immagini in MVC3/Razor? Un aiuto, una liberia, qualcosa?MVC3/Thumbnail rasoio/ridimensionare idee immagine?

Sarebbe bello, se in qualche modo potessi gestire la dimensione delle immagini dal controller. O anche a rasoio. Esempio: nella vista indice voglio che le immagini abbiano una certa dimensione, ma nella vista dettagli voglio che siano a grandezza naturale.

So che questa domanda è vaga, ma non riuscivo a trovare nulla su google/stackoverflow oltre che vecchi thingos mvc1.

Come gestite normalmente questo?

risposta

10

Dai anche un'occhiata al mio pacchetto nuget Simple.ImageResizer.MvcExtensions.

sito Demo qui: http://imageresizer.apphb.com/

Aggiunge una classe ImageResult che è possibile utilizzare nella vostra azione di controllo che prende un altezza e la larghezza di ingresso che lo rende abbastanza facile da aggiungere il ridimensionamento delle immagini al tuo sito MVC. Mi piacerebbe sentire cosa ne pensate

+0

lo proverò. E buon tempismo. Perché presto avrò bisogno di uno buono. –

+1

Grande. L'ho aggiunto solo oggi ma puoi trovare il sito di esempio mvc 4 nel repository github se hai problemi: https://github.com/terjetyl/Simple.ImageResizer – terjetyl

+0

Grazie amico .... –

25

C'è un modo semplice e dinamico per creare miniature e ridimensionare le immagini in MVC3/Razor? Un aiuto, una liberia, qualcosa?

È possibile utilizzare l'assembly System.Drawing incorporato e la classe Image per ottenere ciò. È possibile scrivere un'azione del controllore che verrà passata come argomenti il ​​nome dell'immagine e la nuova dimensione desiderata e questa azione del controller eseguirà il ridimensionamento e restituirà la nuova immagine.

Ad esempio:

public ActionResult Thumbnail(int width, int height) 
{ 
    // TODO: the filename could be passed as argument of course 
    var imageFile = Path.Combine(Server.MapPath("~/app_data"), "test.png"); 
    using (var srcImage = Image.FromFile(imageFile)) 
    using (var newImage = new Bitmap(width, height)) 
    using (var graphics = Graphics.FromImage(newImage)) 
    using (var stream = new MemoryStream()) 
    { 
     graphics.SmoothingMode = SmoothingMode.AntiAlias; 
     graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
     graphics.DrawImage(srcImage, new Rectangle(0, 0, width, height)); 
     newImage.Save(stream, ImageFormat.Png); 
     return File(stream.ToArray(), "image/png"); 
    } 
} 

Ora andare avanti per inserire questa azione a suo parere:

<img src="@Url.Action("Thumbnail", "SomeController", new { width = 100, height = 50 })" alt="thumb" /> 
+0

Pulito e semplice. Grazie! –

+0

Hai usato Url.Azione. Non dovrebbe essere Html.Azione? –

+2

@Kasper Skov, no, non voglio rendere l'esecuzione di una determinata azione, voglio ottenere l'url di questa azione, quindi il corretto è usare Url.Action. Per saperne di più su Html.Action puoi dare un'occhiata al seguente post del blog: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx –

4

C'è una biblioteca per esso - è MVC3 compatibile, ed è implementato come un HttpModule, così ottiene grandi prestazioni.

È anche gratuito (anche se alcuni plug-in richiedono uno sviluppatore o una licenza commerciale una tantum).

Potete scaricarlo a http://imageresizing.net

Anche se è forte la tentazione di scrivere solo un'azione per esso, ci sono un sacco di bug GDI che dovrete affrontare, uno, ad uno, nel corso degli anni. L'utilizzo di una libreria ti libera dal tracciamento e li evita. Google "Problemi di ridimensionamento delle immagini", il primo risultato è un articolo che ti aiuterà se scrivi il tuo sistema di decodifica/ridimensionamento/codifica.

+0

Dolce! Grazie! ........ –

+0

voglio provare questo, ma non trovo alcuna procedura chiara o tutorial su come chiamare il metodo in asp mvc vista usando '@ Url.Action', ho provato [questo ] (http://imageresizing.net/docs/v4) e [questo] (http://www.hanselman.com/blog/NuGetPackageOfWeek11ImageResizerEnablesCleanClearImageResizingInASPNET.aspx) link? – stom

19

Utilizzando la classe WebImage è possibile ottenere questo System.Web.Helpers.WebImage.

È possibile utilizzare questo capretto per produrre immagini ridimensionate al volo.

codice di esempio:

public void GetPhotoThumbnail(int realtyId, int width, int height) 
{ 
    // Loading photos’ info from database for specific Realty... 
    var photos = DocumentSession.Query<File>().Where(f => f.RealtyId == realtyId); 

    if (photos.Any()) 
    { 
     var photo = photos.First(); 

     new WebImage(photo.Path) 
      .Resize(width, height, false, true) // Resizing the image to 100x100 px on the fly... 
      .Crop(1, 1) // Cropping it to remove 1px border at top and left sides (bug in WebImage) 
      .Write(); 
    } 

    // Loading a default photo for realties that don't have a Photo 
     new WebImage(HostingEnvironment.MapPath(@"~/Content/images/no-photo100x100.png")).Write(); 
} 

In una vista che avresti avuto qualcosa di simile:

<img src="@Url.Action("GetPhotoThumbnail", 
    new { realtyId = item.Id, width = 100, height = 100 })" /> 

di più qui: Resize image on the fly with ASP.NET MVC


Ho appena trovato questo bel tutorial su WebImage nel sito ASP.NET:

Working with Images in an ASP.NET Web Pages (Razor) Site.

+2

Questo ha funzionato piuttosto bene per me. Un avvertimento è che ho finito per scrivere una piccola cache sul lato server (usando Save() invece di Write()), perché il ridimensionamento di foto di grandi dimensioni si è rivelato essere intensivo della CPU e la mia istanza di micro AWS EC2 non stava tenendo il passo. – DenNukem

+0

Questa è davvero una bella vulnerabilità per fare alcuni attacchi DoS. – gog

Problemi correlati