0

如果高度和宽度与原始图像相同,是否有办法(参数)避免 Imageresizing 处理图像?

如果没有,我在哪里以及如何取消插件中的缩放过程?

4

1 回答 1

0

ImageResizer 不会缩放已经是适当大小的图像。但是,它确实会解码它们,剥离元数据,并将它们重新编码为与 Web 兼容且对 Web 有效的格式(通常为 jpg 或 png)。

如果您希望 ImageResizer 提供原始文件,跳过整个过程,这是一个不同的问题,我将在下面尝试回答。

这是实现该目标的主要挑战:要发现源图像文件的宽度和高度,您必须对其进行解码 - 至少部分解码。

这种优化仅在有限的情况下有用(或可能)

  1. 源文件的格式允许您解析宽度和高度,而无需将整个文件加载到内存中。JPG/PNG 是,TIFF - 不,FreeImageDecoder 支持 30 多种格式,不。
  2. 源文件位于本地、低延迟磁盘存储上,并且可通过 IIS 访问 - 消除了 UNC 路径和插件 S3Reader、SqlReader、AzureReader、RemoteReader、MongoReader 等。
  3. 没有 URL 重写规则。
  4. 没有使用自定义插件。
  5. 该图像已采用经过适当压缩设置的 Web 优化格式,并删除了元数据。
  6. 没有使用其他 URL 命令
  7. 没有水印规则。
  8. 您不需要控制缓存标头。
  9. 您 100% 确定该图像不是恶意的(如果不重新编码,您无法确保该文件不能既是脚本又是位图)。

此外,除非您缓存结果,否则这种“优化”实际上不会改善响应时间或服务器端性能。由于维度数据需要单独解码,因此无论它们是否恰好有维度匹配,都会给所有请求增加统一的、显着的开销。

我认为这很有用的唯一情况是,如果您花费大量时间在 Photoshop 中优化压缩,并且除非需要,否则不希望 ImageResizer 触摸它。如果您担心,请不要在该场景中应用 URL。或者,设置process=no为保持原始字节不变。

绝对可以制作一个插件来做到这一点;但这不是很多人想要使用的东西,而且我无法想象一个可以带来净收益的使用场景。

如果您想继续前进,只需处理Config.Current.Pipeline.PreHandleImage事件并替换e.ResizeImageToStream为解析返回的流的代码e.GetSourceImage(),应用您的维度逻辑(与 相比Config.Current.GetImageBuilder().GetFinalSize(),然后重置流并在需要时逐字复制它,如下所示:

 using (Stream source = e.GetSourceImage())
     StreamExtensions.CopyToStream(source,stream); //4KiB buffer

这可能无法处理某些情况,例如图像实际上需要将大小调整为小 1px,但您正在添加 1 px 边框等,但它已经接近了。如果您很挑剔,请查看 GetFinalSize 的源代码并返回图像边界而不是画布边界。

于 2012-06-20T14:53:14.263 回答