登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  前端

SVG位移滤镜的scale怎样影响偏移距离

来源:17golang原创

时间:2026-10-31 03:55:36 352浏览 收藏

SVG的feDisplacementMap中,scale放大的是位移图通道值相对0.5的差值。固定通道图与坐标单位时,scale加倍,采样偏移也加倍;但scale为40不代表所有像素统一移动40,也不代表最大单轴偏移就是40。

规范地址:https://www.w3.org/TR/filter-effects-1/。下面围绕“怎样选取位移强度”解释参数、输入与裁切的约束,不把这一局部滤镜问题扩展成不必要的服务架构。

先明确要控制哪一种位移

假设要给一块装饰图形加入轻微扭曲。需要先确定的是局部采样偏移幅度,而不是把整个元素像CSS位移那样搬到另一处。in提供原图,in2提供位移图;xChannelSelector和yChannelSelector选择后者的通道。

通道恒定时,示例可以表现整体平移;通道随空间变化时,不同位置得到不同偏移,才会形成扭曲。scale控制幅度,不负责定义图案的疏密。

用通道值和坐标单位限定距离

令XC、YC为所选通道值,则横向采样偏移dx = scale × (XC − 0.5),纵向采样偏移dy = scale × (YC − 0.5)。输出位置(x,y)读取原图(x+dx,y+dy)的颜色,这是反向采样关系。

采样偏移静态关系图:dx和dy分别由scale与所选通道相对0.5的差值决定;不是把图形坐标直接加上scale。
采样偏移静态关系图:dx和dy分别由scale与所选通道相对0.5的差值决定;不是把图形坐标直接加上scale。这是原创静态说明图。

通道处于0到1时,单轴偏移范围是−|scale|/2到+|scale|/2。这个界限属于坐标空间中的采样偏移;经过viewBox、元素变换和页面显示缩放后,屏幕像素距离还会变化。primitiveUnits用于明确滤镜基元的单位,filterUnits则负责滤镜区域的坐标系统,两者不能互相替代。

三种scale设置怎样比较

先固定XC为0.75、YC为0.5,比较以下三种设置。它们的差别来自公式推导,不是本文执行后的测量结果。

scaledxdy含义
000位移采样关闭
2050从右侧5个单位处采样
40100从右侧10个单位处采样

对恒定位移图而言,从更右边采样,原图形在输出中反而表现为向左移动。不能把“dx正数”直接读成“图形向右走”。对空间变化的位移图,也不应把局部采样关系简化成每个源像素的独立搬运。

用固定色位移图隔离变量

下面源码可独立保存为SVG供读者观察。它用feFlood构造固定map,并显式采用sRGB,使通道计算和上表对应。width、height与viewBox保持一致;只改变scale,便能避免同时改变噪声参数造成误判。

位移滤镜静态结构图:SourceGraphic提供待采样图像,map提供通道,primitiveUnits定义长度单位,滤镜区域约束可见输出范围。
位移滤镜静态结构图:SourceGraphic提供待采样图像,map提供通道,primitiveUnits定义长度单位,滤镜区域约束可见输出范围。这是原创静态说明图。

本例预期dx为10、dy为0,因此矩形可见位置向左偏约10个用户单位。数值是理想采样公式的推导,边缘还会涉及插值。本文没有运行或渲染该SVG,文章配图均为ImageGen原创结构图。

放大scale时要同时考虑的边界

第一项边界是滤镜区域。增大scale可能使边缘效果碰到输出范围,出现裁切;扩大滤镜区域和扩大SVG视口是不同层面的操作。示例把矩形放在区域内部,为当前偏移留出空间。

第二项是颜色空间。滤镜默认采用linearRGB进行颜色处理,若位移图来自颜色输入,不能直接把屏幕上的灰度值等同于公式里的通道值。本例显式设置sRGB,避免固定色示例的中性值被不同颜色空间解释混淆。

第三项是资源代价。大尺寸滤镜区域和复杂滤镜组合可能增加处理开销,不能把scale当成唯一的性能旋钮。应先满足视觉范围,再在目标设备上判断实际成本,而不是编造“某个值必然流畅”的阈值。

调参顺序与常见问题

建议先确认in和in2各自含义,固定通道选择与primitiveUnits,再从小scale开始调整,最后为所需范围处理裁切。想比较幅度时只改scale;想比较纹理密度时保持scale不变,再改位移图生成方式。

0.5一定表示没有位移吗?

公式中的所选通道值恰好为0.5时,对应单轴偏移为0。要确认的是滤镜计算中的实际通道值,而不仅是颜色字符串表面看起来像中灰。

负scale能用来改变方向吗?

从公式看,符号变化会反转采样偏移。理解时仍需区分采样方向与可见图形移动方向。

为什么换了尺寸后效果不同?

先核对坐标单位、viewBox与显示缩放,再看位移图本身是否随对象尺寸改变。比较时必须固定这些条件。

依据:W3C位移滤镜公式、MDN元素说明及primitiveUnits参考。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>