如果高度和宽度与原始图像相同,是否有办法(参数)避免 Imageresizing 处理图像?
如果没有,我在哪里以及如何取消插件中的缩放过程?
ImageResizer 不会缩放已经是适当大小的图像。但是,它确实会解码它们,剥离元数据,并将它们重新编码为与 Web 兼容且对 Web 有效的格式(通常为 jpg 或 png)。
如果您希望 ImageResizer 提供原始文件,跳过整个过程,这是一个不同的问题,我将在下面尝试回答。
这是实现该目标的主要挑战:要发现源图像文件的宽度和高度,您必须对其进行解码 - 至少部分解码。
这种优化仅在有限的情况下有用(或可能)
此外,除非您缓存结果,否则这种“优化”实际上不会改善响应时间或服务器端性能。由于维度数据需要单独解码,因此无论它们是否恰好有维度匹配,都会给所有请求增加统一的、显着的开销。
我认为这很有用的唯一情况是,如果您花费大量时间在 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 的源代码并返回图像边界而不是画布边界。