为简单起见,我想说我有一个需要显示图像缩略图的网页。图像位置存储在数据库中(图像存储在Amazon S3上)。在将大型图像传送到客户端之前,是否可以让我的Web服务器缩小?这样我就不必存储每个图像的缩略图,客户端可以下载较小的文件。
答案 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
:
答案 3 :(得分:0)
是
您创建一个执行Response.Clear()的ASP.Net页面,在Response中设置Content-Type-header并发送图像的二进制数据(也通过Response)。图像可以在运行时调整大小,但我建议在磁盘上将其缓存一段时间。然后,您将HTML中的图像引用为&lt; img src =“http://server/yourimagepage.aspx”&gt;。要在发送之前将图像存储在内存中,可以使用MemStream。
我有示例代码,但现在不在我面前,抱歉。 :)