2011-09-06 62 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