如果宽度和高度与原始相同,如何避免图像复现?

时间:2012-06-20 14:08:16

标签: imageresizer

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

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

1 个答案:

答案 0 :(得分:0)

ImageResizer不会缩放已经合适尺寸的图像。然而,它确实对它们进行解码,剥离元数据,并将它们重新编码为Web兼容和Web高效格式(通常为jpg或png)。

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

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

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

  1. 源文件的格式允许您解析宽度和宽度。高度而不将整个文件加载到内存中。 JPG / PNG是的,TIFF - 不,FreeImageDecoder支持30多种格式,没有。
  2. 源文件位于本地低延迟磁盘存储上,并且可以访问IIS - 消除了UNC路径和插件S3Reader,SqlReader,AzureReader,RemoteReader,MongoReader等。
  3. 没有网址重写规则。
  4. 没有使用自定义插件。
  5. 图片已采用网络优化格式,并具有适当的压缩设置,并删除了元数据。
  6. 没有使用其他网址命令
  7. 没有水印规则。
  8. 您无需控制缓存标头。
  9. 您100%确定图像不是恶意的(没有重新编码,您无法确保该文件不能同时是脚本和位图)。
  10. 此外,除非您缓存了结果,否则这种“优化”实际上不会改善响应时间或服务器端性能。由于维度数据需要单独解码,因此无论是否匹配维度,都会为所有请求增加统一的重要开销。

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

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

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

    Config.Current.GetImageBuilder().GetFinalSize()

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