对比度交换技巧:使用 CSS 滤镜提升图像性能

Avatar of Una Kravets
Una Kravets

DigitalOcean 为您的旅程的每个阶段提供云产品。 立即开始使用 $200 免费积分!

使用 CSS 滤镜效果和混合模式,我们现在可以利用 各种技术 在浏览器中直接对图像进行样式设置。 但是,创建美观的主题并不是滤镜效果的全部用途。 您可以使用滤镜来指示悬停状态,隐藏密码,以及现在用于 Web 性能。

在尝试使用混合模式进行双色调图像效果的性能提升(我很快就会写一篇关于这方面的文章)时,我发现了一些更令人兴奋的东西。 一个主要的图像优化优势! 思路是降低源图像的对比度,减小其文件大小,然后使用 CSS 滤镜增强对比度!

从您的图像开始,然后去除对比度,然后使用 CSS 滤镜重新应用对比度。

工作原理

让我们准确地说明一下它是如何工作的。

  1. 使用线性变换函数降低图像对比度(Photoshop 可以做到这一点)。
  2. 在 CSS 中对图像应用对比度filter以弥补对比度降低。

第一步是在允许您以线性方式降低对比度的程序中打开图像。 Photoshop 的传统模式在这方面做得很好(图像>调整>亮度/对比度)。

您可以在 Photoshop CC 中通过图像>调整>亮度/对比度进入此屏幕。

并非所有程序都使用相同的函数来应用图像变换(例如,这将无法与 macOS 默认图像编辑器一起使用,因为它使用不同的技术来降低对比度)。 很多用于将图像效果构建到浏览器中的工作最初是由 Adobe 完成的,因此 Photoshop 的传统模式与浏览器图像效果保持一致是有道理的。

然后,我们对图像应用一些 CSS 滤镜。 我们将使用的滤镜是contrast和(一点点)brightness。 对于 50% 的传统 Photoshop 降低,我对每个图像应用了filter: contrast(1.75) brightness(1.2);

重大节省

这种技术对于减小图像大小,从而减小页面总重量非常有效。 在以下研究中,我使用了 4 张在 iPhone 上拍摄的鲜艳照片,使用 Photoshop 传统模式降低了 50% 的对比度,以最大质量 (10) 保存了每张照片,然后对每个图像应用了filter: contrast(1.75) brightness(1.2);。 这些是结果。

您可以使用 此处提供的实时演示 自行尝试!

在上述所有情况下,我们通过使用 CSS 滤镜降低并重新应用对比度,将图像大小节省了 23% 到 28%。 这是将每个图像以最大质量保存的情况下。

如果您仔细观察,您会看到一些图像质量的明显损失。 这在大多数为深色图像的情况下尤其如此。 因此,这种技术并不完美,但它确实以一种有趣的方式证明了图像节省。

浏览器支持注意事项

请注意,浏览器对 CSS 滤镜的支持“相当好”。

此浏览器支持数据来自 Caniuse,其中包含更多详细信息。 数字表示浏览器从该版本开始支持该功能。

桌面

ChromeFirefoxIEEdgeSafari
18*35796*

移动设备/平板电脑

Android ChromeAndroid FirefoxAndroidiOS Safari
1271274.4*6.0-6.1*

如您所见,Internet Explorer 和 Opera Mini 不支持。 Edge 16(当前最新版本)支持 CSS 滤镜,此技术运行良好。 您需要决定降低对比度的图像作为回退是否可接受。

重新绘制怎么办?

您可能在想:“但当我们在图像大小方面节省时,我们却给浏览器带来了更多工作,这不会影响性能吗?” 这是一个好问题! CSS 滤镜确实会触发重新绘制,因为它们会触发window.getComputedStyle()。 让我们分析一下我们的示例。

我所做的是在 Chrome 中打开一个隐身窗口,禁用 JavaScript(只是为了确保我所拥有的扩展程序),将网络设置为“慢速 3G”,并将 CPU 设置为 6 倍减速。

在 6 倍 CPU 减速的情况下,最长的绘制光栅花费了 0.27 毫秒,也就是 0.00027 秒。

虽然图像需要一段时间才能加载,但实际的重新绘制速度很快。 在 6 倍 CPU 减速的情况下,最长的单个光栅化绘制花费了 0.27 毫秒,也就是 0.00027 秒。

CSS 滤镜 源自 SVG 滤镜,并且是目前最受欢迎的 SVG 滤镜效果变换的相对浏览器优化版本。 因此我认为将其用作渐进增强是相当安全的(要了解 IE 用户和 Opera Mini 用户!)。

结论和未来

当降低图像质量时,仍然可以节省大量资源(再次强调,在这个小型研究中,图像以较高的质量保存,以获得更平衡的结果)。 通过像 ImageOptim 这样的优化器运行图像,并根据屏幕大小发送较小的图像文件大小(例如,HTMLCSS 中的响应式图像)将为您节省更多资源。

在 Web 性能优化领域,我认为图像性能是我们减少用户 Web 垃圾和数据的最有效方法,因为图像 是我们发送到 Web 上的最大部分(到目前为止)。 如果我们可以开始利用现代 CSS 来帮助减轻我们图像的负担,我们可以探索全新的优化解决方案。

例如,这可以进一步扩展,使用其他 CSS 滤镜,例如saturatebrightness。 我们可以利用 Gulp 和 Webpack 等自动化工具来为我们应用图像效果,就像我们使用自动化工具来通过优化器运行图像一样。 将此技术与 其他最佳实践 相结合,可以节省我们发送给用户的基于像素的资产。