2011-09-06 49 views
15

有沒有一種簡單而動態的方式來創建縮略圖和調整MVC3/Razor中的圖像?幫手,庫利,什麼?MVC3 /剃刀縮略圖/調整圖像的想法?

這將是很好,如果我以某種方式可以管理從控制器的圖像的大小。甚至在剃鬚刀視角。例如:在索引視圖中,我希望圖像具有一定的大小,但在細節視圖中,我希望它們是全尺寸。

我知道這個問題含糊不清,但我真的找不到任何對舊的mvc1 thingos的谷歌/ stackoverflow的東西。

你們通常如何處理這個問題?

回答

10

也看看我的Simple.ImageResizer.MvcExtensions nuget包。

這裏演示網站:http://imageresizer.apphb.com/

添加,你可以在你的控制器動作,需要一個高度和寬度輸入使它很容易添加圖像調整到你的MVC網站使用ImageResult類。很想聽聽你的想法

+0

將試用它。和好的時機。因爲我很快就會需要一個好的。 –

+1

太好了。今天只添加它,但你可以找到示例mvc 4網站在github存儲庫,如果你有麻煩:https://github.com/terjetyl/Simple.ImageResizer – terjetyl

+0

謝謝隊友.... –

25

是否有一種簡單動態的方式在MVC3/Razor中創建縮略圖和調整 圖像?幫手,庫利,什麼?

您可以使用內置的System.Drawing程序集和Image類來實現此目的。您可以編寫一個控制器動作,將其作爲參數傳遞給映像名稱和所需的新大小,並且此控制器動作將執行調整大小並返回新映像。

例如:

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"); 
    } 
} 

現在繼續,包括在您看來這個動作:

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

清潔和簡單。謝謝! –

+0

您已使用Url.Action。不應該我Html.Action? –

+2

@ Kaspersky Skov,不,我不想渲染給定動作的執行,我想獲取此動作的URL,所以正確的是使用Url.Action。要了解更多關於Html.Action的信息,可以查看以下博客文章:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx –

4

有它一個庫 - 它是MVC3兼容,它的實現爲一個HttpModule,所以它獲得了不錯的表現。

它也是免費的(儘管一些插件需要1次開發者或營業執照)。

您可以在http://imageresizing.net

下載它雖然人們很容易只寫它的作用,也有很多,你必須要處理,一個接一個,多年來GDI錯誤。使用庫可以讓您免於跟蹤和避免它們。谷歌的「圖像調整大小陷阱」,第一個結果是一篇文章,如果你寫你自己的解碼/調整大小/編碼系統將有所幫助。

+0

甜蜜!謝謝!........ –

+0

我想嘗試這個,但我沒有找到任何明確的步驟或教程如何使用'@ Url.Action在asp mvc視圖中調用方法,我試過[this ](http://imageresizing.net/docs/v4)和[this](http://www.hanselman.com/blog/NuGetPackageOfWeek11ImageResizerEnablesCleanClearImageResizingInASPNET.aspx)鏈接? – stom

19

使用WebImage類進來System.Web.Helpers.WebImage你可以實現這一點。

你可以使用這個偉大的孩子在飛行中輸出調整大小的圖像。

示例代碼:

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(); 
} 

在視圖中你有這樣的事情:這裏

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

更多一點:Resize image on the fly with ASP.NET MVC


我剛剛發現這個漂亮有關WebImage在ASP.NET網站的教程:

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

+2

這對我來說工作得很好。一個需要注意的是我最終在服務器端寫了一個小緩存(通過使用Save()而不是Write()),因爲調整大型照片的大小事實證明是CPU密集型的,而且我的AWS EC2微型實例沒有跟上。 – DenNukem

+0

這是一個非常好的漏洞,可以進行一些DoS攻擊。 – gog