【问题标题】:Resize and Display image from server with ASP.NET使用 ASP.NET 从服务器调整大小并显示图像
【发布时间】:2013-03-05 01:56:30
【问题描述】:

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

  1. 我想知道当用户请求图像时是否可以调整大小。不是用户上传的时候。

例如,一个用户去上传一张图片,我不调整它并保存另一个调整大小的图片的副本。相反,当用户通过 ASP.NET img 控件/标记请求图像时,它会动态调整图像大小以显示它并通过 img 标记/控件显示它。

我为什么要这样做?

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

编辑:作为一个初创网站,目前节省磁盘比节省处理时间更好。目前我没有太多钱购买大量空间。希望网站启动时会有所改变。

有什么想法吗?谢谢大家。

【问题讨论】:

  • 嗨,Scott,有什么可能的情况会使磁盘空间比处理能力更昂贵?并且图像大小调整(针对每个用户请求!)是否会占用大量处理资源并影响整体 Web 应用程序的性能?
  • @Nahom:如果它与 Amazon CloudFront 缓存或磁盘缓存(或两者)结合使用,则不会。与预处理相比,动态图像处理具有无穷无尽的优势,其中最小的就是减少了磁盘使用量。

标签: c# asp.net image-processing


【解决方案1】:

我假设您可以“控制”调整大小图像的 url,例如,完整尺寸的图像可能被引用为 <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 功能来避免不必要的处理一遍又一遍的相同图像)。

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

【讨论】:

【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      • 如果您有大图像,调整大小和压缩后的版本将占用原件 %10 的空间,即使您存储显示和缩略图版本也是如此。
      • 否则,只需提供它们并通过浏览器调整大小显示它们,这样会更快。

      【讨论】:

        【解决方案5】:

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

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

        它每次都在工作。

        【讨论】:

        • 这个问题是如果超过一兆字节的图像仍然是兆字节。 C# 调整图像大小,使其实际上不保持 1 MB
        • 是的,它只是为了显示,实际图像大小保持不变。
        • 这适用于非常小的图像(几 KB),但由于上述原因,不建议用于较大的图像。服务器端调整大小,并根据吞吐量缓存,是更好的选择。
        猜你喜欢
        • 1970-01-01
        • 2018-01-07
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多