CSS filter 属性支持 grayscale()、sepia()、blur()、contrast()、brightness()、saturate()、hue-rotate() 等函数,可链式组合且顺序影响结果;但无法实现高光/阴影分离、胶片颗粒或局部模糊等像素级控制,此类需求须借助 canva

简单来说,用CSS的filter属性能快速搞定大部分常见滤镜效果。但如果你追求的是高光阴影分离、胶片颗粒感或者局部模糊这类精细控制,那就得进入canvas的世界,手动操作像素数据了——CSS滤镜更像一个便捷的开关,而非万能的工具箱。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
毫无疑问,CSS filter是实现图片效果最轻量、最快捷的方案。它内置了诸如grayscale()(灰度)、sepia()(怀旧)、blur()(模糊)、contrast()(对比度)、brightness()(亮度)、saturate()(饱和度)、hue-rotate()(色相旋转)等一系列函数,并且支持链式组合调用。
blur(2px) contrast(1.2)和contrast(1.2) blur(2px)看起来会截然不同,前者是在模糊的基础上增强对比,后者则相反。drop-shadow()的局限:这个函数并非真正意义上的图像滤镜,它不分析图像内容,只是为整个元素外框添加投影。因此,别指望用它来模拟复杂的浮雕或晕影效果。sepia(0.8)、contrast(0.85)和blur(0.3px),确实可以营造出不错的老照片氛围。但像老照片常见的褪色偏移、青橙色调分离等更细腻的风格,CSS滤镜就力不从心了。filter: url(#svg-filter)引用时需注意,iOS Safari的支持并不稳定。特别是当SVG滤镜中的kernelUnitLength属性值设置为非1时,效果可能会直接失效。当你需要实现灰度加权计算(而非简单平均)、对RGB通道进行非线性映射、叠加颗粒噪点,或者进行方向性的边缘增强时,canvas的getImageData()方法就成了必经之路。
img.onload = () => { ctx.drawImage(img, 0, 0); const data = ctx.getImageData(0, 0, w, h).data; }。getImageData()返回的data是一个Uint8ClampedArray,每4个元素代表一个像素的R、G、B、A值。处理完后,如果不需要透明度变化,别忘了将Alpha通道(data[i+3])重置为255,否则透明区域可能会出现问题。gray(x+1,y+1) - gray(x,y),然后将得到的差值映射到0-255的范围,并同时加到RGB三个通道上。对于一张1920×1080分辨率的图片,在主线程进行完整的像素循环处理,很容易导致超过100毫秒的卡顿,在移动设备上体验尤其糟糕。
这里有个小提示:想深入前端性能优化?可以关注“前端免费学习笔记(深入)”这类资源。
OffscreenCanvas。你可以在Web Worker中创建它并获取2D上下文,所有的像素计算完全在后台线程进行,丝毫不会阻塞用户界面。requestIdleCallback进行分块处理。例如,每次只计算50行像素,在处理间隙让出主线程,以保证页面滚动、点击等操作的流畅响应。img.onload事件中立即进行全量像素处理。图片加载完成并不等同于它在canvas上渲染就绪。更稳妥的做法是先检查canvas.offsetWidth是否为一个正数。sharp这类库)预生成滤镜效果,仍然是更稳定可靠的选择。通过CSS的filter: url(#id)可以调用内联SVG中定义的复杂滤镜,如(卷积矩阵)或(湍流)。这非常适合需要硬件加速的浮雕、噪点等效果,但代价是兼容性和调试复杂度更高。
时,建议将targetX和targetY设置为1,以确保卷积核的中心对齐。同时,务必开启preserveAlpha="true",否则PNG图片的透明区域可能会出现颜色失真。模拟胶片颗粒感时,baseFrequency(基础频率)应设置在0.002–0.005之间,而非默认的0.05;将numOcta ves(八度数)设为2通常比默认的1能产生更自然的效果。precision mediump float精度下,计算系数容易被截断,导致效果偏差。建议显式声明highp精度,并务必进行实机测试。侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述