为了简单起见,假设我有一个网页需要显示图像的缩略图。这些图像的位置存储在数据库中(图像存储在Amazon S3上)。是否可能在将大图像交付给客户端之前让我的Web服务器缩小它?这样我就不必存储每个图像的缩略图,客户端可以下载更小的文件。
为了简单起见,假设我有一个网页需要显示图像的缩略图。这些图像的位置存储在数据库中(图像存储在Amazon S3上)。是否可能在将大图像交付给客户端之前让我的Web服务器缩小它?这样我就不必存储每个图像的缩略图,客户端可以下载更小的文件。
该主题上的每个教程都过于简化,几乎所有教程都会泄露内存。这是一篇长篇阅读,但是你应该知道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 存储)不太可扩展。使用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页面,使用Response.Clear()清除响应,设置Content-Type-header并通过Response发送图像的二进制数据。该图像可以动态调整大小,但我建议将其缓存一段时间以便在磁盘上进行。然后,您可以从HTML中引用图像,如<img src="http://server/yourimagepage.aspx">。要在发送之前将图像存储在内存中,可以使用MemStream。
我有示例代码,但现在不在我面前,抱歉。 :)
HttpHandler
来为您执行图像操作。 - Grant Thomas