【发布时间】:2012-06-20 14:08:15
【问题描述】:
如果高度和宽度与原始图像相同,是否有办法(参数)避免 Imageresizing 处理图像?
如果没有,我在哪里以及如何取消插件中的缩放过程?
【问题讨论】:
标签: imageresizer
如果高度和宽度与原始图像相同,是否有办法(参数)避免 Imageresizing 处理图像?
如果没有,我在哪里以及如何取消插件中的缩放过程?
【问题讨论】:
标签: imageresizer
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
这可能无法处理某些情况,例如图像实际上需要将大小调整为小 1 像素,但您要添加 1 像素的边框等,但它已经接近了。如果您很挑剔,请查看 GetFinalSize 的源代码并返回图像边界而不是画布边界。
【讨论】: