图像在asp.net中动态调整大小

时间:2011-01-07 19:25:41

标签: c# asp.net thumbnails image-resizing

为简单起见,我想说我有一个需要显示图像缩略图的网页。图像位置存储在数据库中(图像存储在Amazon S3上)。在将大型图像传送到客户端之前,是否可以让我的Web服务器缩小?这样我就不必存储每个图像的缩略图,客户端可以下载较小的文件。

4 个答案:

答案 0 :(得分:9)

关于此主题的每个教程都过度简化了这种情况,并且几乎所有泄漏内存。这是一个很长的阅读,但you should know about the 29 image resizing pitfalls所以你可以避免它们。

wrote a library to do server-side dynamic image resizing safely。这不是可以在1个教程甚至10中正确完成的事情。你可以解决80%的错误,但不是100%。当你在做这个资源密集型的事情时,你无法忍受错误或内存泄漏。

核心库是免费的开源软件,但Amazon S3插件是Performance版本的一部分,该版本的许可证费用为249美元。 Performance Edition附带了S3,MS SQL,Azure,MongoDB GridFS和CloudFront集成的源,示例和文档,以及TB级磁盘缓存和内存缓存。

从我可以访问的统计数据来看,imageresizing.net似乎是同类中使用最广泛的库。它运行至少5个社交网络,并与20TB的图像集合一起使用。大多数大型站点都使用S3插件,因为本地存储(甚至是SAN)的扩展性不是很高。

答案 1 :(得分:1)

当然,没问题。网络上有大量资源可以显示如何从数据库中提取图像。所以我不会在这里复制。

加载图像后,可以使用.NET轻松缩小图像。以下URL有一个示例。它并不能完全按照您的操作进行操作,但它会生成图像的缩略图。

http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net

答案 2 :(得分:1)

使用System.Web.Helpers.WebImage中的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();
}

更多相关信息:Resize image on the fly with ASP.NET MVC


这是一个很棒的教程,展示了如何直接从ASP.NET站点使用WebImage

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

答案 3 :(得分:0)

您创建一个执行Response.Clear()的ASP.Net页面,在Response中设置Content-Type-header并发送图像的二进制数据(也通过Response)。图像可以在运行时调整大小,但我建议在磁盘上将其缓存一段时间。然后,您将HTML中的图像引用为&lt; img src =“http://server/yourimagepage.aspx”&gt;。要在发送之前将图像存储在内存中,可以使用MemStream。

我有示例代码,但现在不在我面前,抱歉。 :)