3

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

4

4 回答 4

9

关于这个主题的每个教程都过度简化了这种情况,几乎所有的教程都会泄漏内存。这是一篇长篇文章,但您应该了解 29 个图像大小调整陷阱,以便避免它们。

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

核心库是免费和开源的,但 Amazon S3 插件是 Performance 版的一部分,许可费为 249 美元。Performance Edition 随附用于 S3、MS SQL、Azure、MongoDB GridFS 和 CloudFront 集成以及 TB 级磁盘缓存和 memcaching 的源代码、示例和文档。

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

于 2012-03-29T16:32:56.877 回答
2

好没问题。网络上有大量资源展示了如何从数据库中提取图像。所以我不会在这里复制它。

加载图像后,您可以使用 .NET 轻松缩小它。以下 URL 中有一个示例。它并不能完全按照您正在做的事情做,但它确实会生成图像的缩略图。

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

于 2011-01-07T19:30:41.990 回答
1

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

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


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

在 ASP.NET 网页 (Razor) 站点中处理图像

于 2012-05-02T19:17:20.743 回答
0

是的。

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

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

于 2011-01-07T19:32:38.447 回答