为简单起见,假设我有一个需要显示图像缩略图的网页。图像位置存储在数据库中(图像存储在 Amazon S3 上)。是否可以让我的 Web 服务器在将大图像交付给客户端之前按比例缩小它?这样我就不必存储每个图像的缩略图,客户端可以下载一个较小的文件。
4 回答
关于这个主题的每个教程都过度简化了这种情况,几乎所有的教程都会泄漏内存。这是一篇长篇文章,但您应该了解 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)的可扩展性不高。
好没问题。网络上有大量资源展示了如何从数据库中提取图像。所以我不会在这里复制它。
加载图像后,您可以使用 .NET 轻松缩小它。以下 URL 中有一个示例。它并不能完全按照您正在做的事情做,但它确实会生成图像的缩略图。
http://blackbeltcoder.com/Articles/graphics/creating-website-thumbnails-in-asp-net
使用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 站点使用:
是的。
您创建一个执行 Response.Clear() 的 ASP.Net 页面,在 Response 中设置 Content-Type-header 并发送图像的二进制数据(也通过 Response)。图像可以即时调整大小,但我建议在磁盘上缓存一段时间。然后,您将 HTML 中的图像引用为 <img src="http://server/yourimagepage.aspx">。为了在发送之前将图像存储在内存中,您可以使用 MemStream。
我有示例代码,但现在不在我面前,抱歉。:)