使用ASP.NET调整服务器大小和显示图像

时间:2009-03-15 06:12:43

标签: c# asp.net image-processing

有个问题。我的服务器上托管了图片。我已经知道上传图像以调整大小并保存的方法,但我还记得另一个想法。

  1. 我想知道在用户请求图片时是否有办法调整大小。不是在用户上传时。
  2. 因此,例如,用户去上传图像,我不调整它并保存已调整大小的图像的另一个副本。相反,当用户通过ASP.NET img控件/标记请求图像时,它会动态调整图像大小以显示它并通过img标记/控件显示它。

    我为什么要这样做?

    节省磁盘空间。大多数服务器都有磁盘空间限制,但不是服务器处理限制。所以我想节省磁盘空间并改为使用处理空间。

    编辑:作为一个初创网站,它目前比节省处理时间更能节省磁盘。此刻我没有太多的钱用于大量的空间。希望它会在网站发布时发生变化。

    有什么想法吗?谢谢你们和男孩们。

5 个答案:

答案 0 :(得分:4)

我假设您可以“控制”调整大小的图片的网址,例如,可以将完整尺寸的图片引用为<img src="uploads/myphoto.jpg"/>,缩略图可以指向ASPX或ASHX,如<img src="uploads/myphoto.jpg.ashx"/>

这个 article on CodeProject - Dynamic Image Resize 似乎有你正在寻找的源代码(尽管它在VB中,如果你是C#人员,应该不难移植) 。希望有所帮助。

最后,我建议您考虑各种形式的缓存(使用Http-Headers,以确保尽可能在客户端或代理处缓存图像;以及使用内置的ASP.NET功能来避免不必要的处理相反的图像反复出现)。

虽然您将节省磁盘配额,但您实际上是在放慢每个其他页面/请求的速度......只是一个想法。

答案 1 :(得分:2)

动态图像大小调整具有许多优点,其中最少的是减少磁盘空间使用。但是,它确实需要与一种持久性缓存相结合,例如Amazon CloudFront或磁盘缓存。

动态图像大小调整可以让您在网站上获得极大的灵活性,而预生成的图像变体可以锁定您,防止您必须进行的最终更改。与缓存结合使用时,两者之间没有运行时性能差异。

ImageResizer library offers disk caching, CloudFront caching, and correct memory and cache management。自2007年以来,它一直在不断改进和维护,并且非常防弹。它也运行着一些社交网站,有些拥有超过一百万张图片。

这是经过时间考验,经过流量测试和经过单元测试的库:)它使用起来非常简单 - 您只需将?width=x&height=y添加到查询字符串即可。功能可以通过20多个插件添加,因此您不会被未使用的代码和功能所拖累。

CraigD提到的文章因其使用HttpHandler而不是使用HttpModule而在性能方面受到限制 - 在将调整大小后的图像写入磁盘后,HttpHandler无法将请求传回IIS本机代码执行。它也不能正确调整jpeg编码或与ASP.NET缓存或URL授权系统一起使用。虽然,我不得不承认 - 与我见过的大部分示例代码相比,它violates far fewer of the image resizing pitfalls I've compiled

我强烈建议using the ImageResizer library。这是很好的代码,我写了:)如果你最终使用示例代码或编写自己的代码,please avoid these pitfalls

答案 2 :(得分:0)

您可以创建IHttpHandler的实现来响应图像请求,在该处理程序中,您可以拥有从磁盘加载图像并将其转换为所需大小的代码。您需要使用响应返回正确的mime类型,并使用WriteBytes方法(或类似的东西,我忘记了名称)。此外,您可以查看内容过期标头,以便可以不必每次由同一客户端加载图像,而是缓存。

答案 3 :(得分:0)

您声称无限制处理但磁盘空间有限。大多数情况下,即使他们没有强制执行处理限制,因为您拥有更多客户,点击您的网站,处理将是比存储空间更糟糕的瓶颈,并且添加更多处理将花费更多。此外,

  • 如果您有大图像,调整大小和压缩版本将占用原始空间的10%,即使您存储显示和缩略图版本。
  • 否则,只需提供服务并通过浏览器显示调整大小,就会更快。

答案 4 :(得分:-1)

实际上并不是实际调整图像的大小,而是在显示图像时调整大小,但我成功使用只是简单

 <img src="myimage" height="height you want to give" width="width you want
 to give" alt="" />

每次都在工作。