ASP.NET中动态调整图像大小

3

为了简单起见,假设我有一个网页需要显示图像的缩略图。这些图像的位置存储在数据库中(图像存储在Amazon S3上)。是否可能在将大图像交付给客户端之前让我的Web服务器缩小它?这样我就不必存储每个图像的缩略图,客户端可以下载更小的文件。


请注意,完整的图像始终需要传输,唯一的区别是谁会通过网络拉取它。话虽如此,您可以实现一个 HttpHandler 来为您执行图像操作。 - Grant Thomas
2
你提到你的图像存储在S3上 - 你的应用程序是在单个服务器上运行还是云应用程序?如果你在单个服务器上运行应用程序,加载大型图像并调整大小会产生相当大的开销,你可能只想在没有创建缩略图时创建缩略图,然后将其存储在磁盘上,这样除非图像发生更改,否则无需再次运行代码。 - BenAlabaster
ImageResizing.Net项目同时提供S3图像缩放和磁盘缓存功能,是广泛使用和经过充分测试的软件。 - Lilith River
4个回答

9

该主题上的每个教程都过于简化,几乎所有教程都会泄露内存。这是一篇长篇阅读,但是你应该知道29个图像调整陷阱,以便避免它们。

编写了一个库来安全地进行服务器端动态图像调整。这不是可以在1个教程或甚至10个教程中正确完成的事情。您可以解决80%的错误,但无法解决100%。而且当您执行这种资源密集型操作时,无法容忍错误或内存泄漏。

核心库是免费且开源的,但Amazon S3插件是Performance版的一部分,其具有249美元的许可证费用。Performance Edition提供S3,MS SQL,Azure,MongoDB GridFS和CloudFront集成的源代码,示例和文档,以及千兆字节级别的磁盘缓存和memcaching。

根据我所能获取的统计数据,imageresizing.net 是同类库中使用最广泛的。它至少在 5 个社交网络上运行,并且可用于 20TB 大小的图像集合。大多数大型网站使用 S3 插件,因为本地存储(甚至是 SAN 存储)不太可扩展。

2
+1 for imageresizing.net - 它功能齐全,快速,易于设置,可扩展且价格实惠。编写自己的程序将会花费更多的时间,并且最终仍然会存在错误。 - jaminto

2

1

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

更多相关信息请点击这里:使用ASP.NET MVC动态调整图像大小


这是一个非常好的教程,展示了如何直接从ASP.NET网站使用WebImage

在ASP.NET Web Pages (Razor)网站中处理图像


0

是的。

您可以创建一个ASP.Net页面,使用Response.Clear()清除响应,设置Content-Type-header并通过Response发送图像的二进制数据。该图像可以动态调整大小,但我建议将其缓存一段时间以便在磁盘上进行。然后,您可以从HTML中引用图像,如<img src="http://server/yourimagepage.aspx">。要在发送之前将图像存储在内存中,可以使用MemStream。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接