【问题标题】:How to avoid imageresizing if width and height is same as original?如果宽度和高度与原始图像相同,如何避免图像大小调整?
【发布时间】:2012-06-20 14:08:15
【问题描述】:

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

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

【问题讨论】:

    标签: imageresizer


    【解决方案1】:

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

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

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

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

    1. 源文件的格式允许您解析宽度和高度,而无需将整个文件加载到内存中。 JPG/PNG 是,TIFF - 否,FreeImageDecoder 支持 30 多种格式,否。
    2. 源文件位于本地、低延迟磁盘存储上,可通过 IIS 访问 - 消除了 UNC 路径和插件 S3Reader、SqlReader、AzureReader、RemoteReader、MongoReader 等。
    3. 没有 URL 重写规则。
    4. 没有使用自定义插件。
    5. 图片已采用经过适当压缩设置的网络优化格式,已删除元数据。
    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
    

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

    【讨论】:

    • 感谢您的分析回答:) 我的问题是:我们不想弄乱一个已经“手动”优化的图像,但我会重新考虑并尝试找到另一个解决问题的方法.如果没有找到其他插件,我现在知道如何创建我的插件 :) !再次感谢!
    • 如果您不想弄乱手动优化的图像,只需不要添加查询字符串,ImageResizer 不会触及它。服务器无法知道它正在处理的图像是否是手动优化的,因此它无法做出您要求的决定。
    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2014-04-04
    • 2018-12-29
    • 2015-10-13
    • 2020-10-20
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多