目錄
CSS vs. SVG
SVG filters
filters的使用
feColorMatrix
RGB值
着色
混合通道
ALPHA值
Blowing out channels
Lighten 和 darken
GRAYSCALE
组合在一起
filter效果的参考
扩展阅读
大漠
首頁 web前端 html教學 详解feColorMatrix_html/css_WEB-ITnose

详解feColorMatrix_html/css_WEB-ITnose

Jun 24, 2016 am 11:26 AM

你见过去年年底Spotify分享的一个主题吗?他们通过图像颜色处理,达到一个令人折服的视觉审美效果。

图像处理是一种非常强大的处理机制,在项目中添加一点小技巧,Web浏览器通过Web的过滤器可以动态处理图像色彩,这样将使你的项目能脱颖而出。

CSS vs. SVG

今年早些时候,推出的 CSSgram 库,使用CSS的 filter 和Blend Modes重新创建了 Instagram 过滤器。

现在使用CSS Blend Modes可以做一些修补,但是CSS的 filter 有一个极大的缺陷,其缺乏一个关键特性来对每个通道做处理。虽然CSS的 filter 很方便(其实就是源自于SVG的一种快捷方式),但无法提供控制RGBA通道。SVG(特别是 feColorMatrix )提供了更强大的力量,直接让CSS的 filter 升了一个层级,能更好的处理图像和得到更多的特殊效果。

SVG filters

在SVG的世界中,filter效果使用 fe- 前缀表示(就是“过滤效果”)。他们可以产生各种各样的色彩效果,也可以产生模糊和3D纹理。虽然 fe- 前缀一词有点松,但这篇文章后面做的总结都是有关于SVG的filter效果的方法。

目前浏览器对SVG filter的支持情况如下所示:

是的,在大多数情况之下,SVG filter都得到较好的支持,除非你还需要兼容IE9或IE9以下的浏览器。相对于CSS的filter和Blend Modes而言,SVG filter的浏览器支持度还是相对稳定的。不过也有一些奇怪的问题,并不像CSS的Blend Modes只在Chrome v46才会有 multiply 、 difference 和 exclusion 问题 。

注意:一些3D过滤效果,比如 feConvolveMatrix ,在某些浏览器中有已知的缺陷。尽管本文主要关注是 feColorMatrix ,但也无法做到。同时记住,在任何浏览器中性能将不可避免地遭到微小的影响。

filters的使用

SVG filters的使用基本上类似这样:

<svg>  <filter id="filterName">    // filter definition here can include    // multiple of the above items  </filter></svg>
登入後複製

在SVG中,你可以声明一个filter。在大多数情况之下,可以使用SVG的 defs 来声明你想要的filter,然后可以在CSS这样使用声明的filter:

.filter-me {  filter: url('#filterName');}
登入後複製

filter的 URL 是相对的,所以 filter: url('../img/filter.svg#filterName') 和 filter: url('http://una.im/filters.svg#filterName') 都是有效的。

feColorMatrix

当谈到颜色的处理, feColorMatrix 是你最好的选择。 feColorMatrix 是过滤中的一种类型,使用矩阵来影响颜色的每个通道(基于RGBA),你可以将其想象成Photoshop中通道编辑一样。

feColorMatrix 看起来像这样(原始图像RGBA的值默认为 1 )。

<filter id="linear">    <feColorMatrix      type="matrix"      values="R 0 0 0 0              0 G 0 0 0              0 0 B 0 0              0 0 0 A 0 "/>    </feColorMatrix> </filter>
登入後複製

矩阵计算RGBA自已每行的最终值,每个RGBA通道有自身的RGBA通道。最后一个值是一个乘数。最后RGBA的值从上向下读,像下面这个列表:

/* R G B A 1 */1 0 0 0 0 // R = 1*R + 0*G + 0*B + 0*A + 00 1 0 0 0 // G = 0*R + 1*G + 0*B + 0*A + 00 0 1 0 0 // B = 0*R + 0*G + 1*B + 0*A + 00 0 0 1 0 // A = 0*R + 0*G + 0*B + 1*A + 0
登入後複製

下图更形象:

RGB值

着色

你可以遗漏或混合颜色通道给图像着色,像下面这样:

<!-- lacking the B & G channels (only R at 1) --><filter id="red">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   0   0   0   0            0   0   0   0   0            0   0   0   1   0 "/></filter><!-- lacking the R & G channels (only B at 1) --><filter id="blue"> <feColorMatrix    type="matrix"    values="0   0   0   0   0            0   0   0   0   0            0   0   1   0   0            0   0   0   1   0 "/></filter><!-- lacking the R & B channels (only G at 1) --><filter id="green">  <feColorMatrix    type="matrix"    values="0   0   0   0   0            0   1   0   0   0            0   0   0   0   0            0   0   0   1   0 "/></filter>
登入後複製

这就是将 green 过滤器添加到图像上,其结果看起来像这样:

混合通道

你也可以通过混合RGB通道得到固定的颜色,并且给图像着色:

<!-- lacking the B channel (mix of R & G)Red + Green = YellowThis is saying there is no yellow channel--><filter id="yellow">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   1   0   0   0            0   0   0   0   0            0   0   0   1   0 "/></filter><!-- lacking the G channels (mix of R & B)Red + Blue = Magenta--><filter id="magenta">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   0   0   0   0            0   0   1   0   0            0   0   0   1   0 "/></filter><!-- lacking the R channel (mix of G & B)Green + Blue = Cyan--><filter id="cyan">  <feColorMatrix    type="matrix"    values="0   0   0   0   0            0   1   0   0   0            0   0   1   0   0            0   0   0   1   0 "/></filter>
登入後複製

上面的示例,是在CMYK模式下混合颜色,删除 red 通道将意味着 green 和 blue 依然存在。当 green 和 blue 混合将创建 cyan , red 和 blue 混合将创建 magenta 。

@Justin McDowell 曾经写过 一篇文章阐述HSL (hue, saturation, lightness)颜色。我们也需要记住,在SVG中亮度的值是指光度。在这里,每个通道都会保留一个亮度的级别,比如我们看到的图像,就保留了一个洋红色:

为什么在云上和亮度的地方会变成洋红色?看看下面的RGB颜色图:

当一个颜色值失踪后会使用其他两个值取而代之。比如,没有 green 颜色通道就会没有 white 、 cyan 或 yellow 。其实他们并没有消失,只不过他们的亮度值(或 alpha )尚未触及。让我们看看操作这些 alpha 值会发生什么?

ALPHA值

我们可以通过 alpha (第四列)来突出阴影和亮度。第四行受 alpha 通道影响,而第四列将影响每个通道的亮度值,如:

<!-- Acts like an opacity filter at .5 --><filter id="alpha">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   1   0   0   0            0   0   1   0   0            0   0   0   .5  0 "/></filter><!-- increases green opacity to be     on the same level as overall opacity --><filter id="hard-green">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   1   0   1   0            0   0   1   0   0            0   0   0   1   0 "/></filter><filter id="hard-yellow">  <feColorMatrix    type="matrix"    values="1   0   0   1   0            0   1   0   1   0            0   0   1   0   0            0   0   0   1   0 "/></filter>
登入後複製

在接下来的示例中,红色的矩阵基础上给 blue 的通道添加了 100% 的 alpha 。我们还保留 red 值,覆盖任何 red 的痕迹,会变成 blue ,而红色的亮度值中 blue 和 red 混合将成为 magenta 。

<filter id="blue-shadow-magenta-highlight">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   0   0   0   0            0   0   1   1   0            0   0   0   1   0 "/></filter>
登入後複製

如果最后一个值小于 0 (变成 -1 ),就会得到相反效果。 blue 的痕迹就会变成 red 。下面就是取值为 -1 的效果:

<filter id="red-overlay">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   0   0   0   0            0   0   1  -1   0            0   0   0   1   0 "/></filter><filter id="identical-red-overlay">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   0   0   0   0            0   0   0   0   0            0   0   0   1   0 "/></filter>
登入後複製

把 -1 换成 .5 ,混合后颜色效果如下:

<filter id="blue-magenta-2">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   0   0   0   0            0   0   1  .5   0            0   0   0   1   0 "/></filter>
登入後複製

Blowing out channels

我们也可以通过第四行的个人通道影响整个 alpha 通道。示例中有一个蓝色的天空,可以将蓝色的天空变成白色,如下:

<filter id="elim-blue">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   1   0   0   0            0   0   1   0   0            0   0   -2   1   0 "/></filter>
登入後複製

下面演示几个混合通道的示例:

<!-- No G channel, Red is at 100% on the G Channel, so the G channel looks Red (luminosity of G channel lost) --><filter id="no-g-red">  <feColorMatrix    type="matrix"    values="1   1   0   0   0            0   0   0   0   0            0   0   1   0   0            0   0   0   1   0 "/></filter><!-- No G channel, Red and Green is at 100% on the G Channel, so the G Channel looks Magenta (luminosity of G channel lost) --><filter id="no-g-magenta">  <feColorMatrix    type="matrix"    values="1   1   0   0   0            0   0   0   0   0            0   1   1   0   0            0   0   0   1   0 "/></filter><!-- G channel being shared by red and blue values. This is a colorized magenta effect (luminosity maintained) --><filter id="yes-g-colorized-magenta">  <feColorMatrix    type="matrix"    values="1   1   0   0   0            0   1   0   0   0            0   1   1   0   0            0   0   0   1   0 "/></filter>
登入後複製

Lighten 和 darken

您可以通过将RGB值每个通道的值设置成小于 1 创建一个 darken 效果,反之,将每个通道值设置成大于 1 可以创建一个 lighten 效果。下图能清晰的阐述这一切:

矩阵效果如下:

<filter id="darken">  <feColorMatrix    type="matrix"    values=".5   0   0   0   0             0  .5   0   0   0             0   0  .5   0   0             0   0   0   1   0 "/></filter>
登入後複製

<filter id="lighten">  <feColorMatrix    type="matrix"    values="1.5   0   0   0   0            0   1.5   0   0   0            0   0   1.5   0   0            0   0   0   1   0 "/></filter>
登入後複製

GRAYSCALE

你可以在一列中设置shade的像素值创建出灰度效果。运用的通道位置不一样,可以得到不同的灰度值。比如下面几个示例:

<filter id="gray-on-light">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            1   0   0   0   0            1   0   0   0   0            0   0   0   1   0 "/></filter>
登入後複製

<filter id="gray-on-mid">  <feColorMatrix    type="matrix"    values="0   1   0   0   0            0   1   0   0   0            0   1   0   0   0            0   0   0   1   0 "/></filter>
登入後複製

<filter id="gray-on-dark">  <feColorMatrix    type="matrix"    values="0   0   1   0   0            0   0   1   0   0            0   0   1   0   0            0   0   0   1   0 "/></filter>
登入後複製

组合在一起

feColorMatrix 真正力量是能够混合多个通道,并且将这些概念运用到图像上产生一个新的图像效果。

<filter id="peachy">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0  .5   0   0   0            0   0   0  .5   0            0   0   0   1   0 "/></filter>
登入後複製

在 red 的通道上采用 1 , green 通道上采用 0.5 ,而 blue 通道不在正常的位置上,而 alpha 设置为 0.5 。看到的效果是深蓝色的痕迹(shadows),突出的红色和一半亮度绿色的混合的中间色调。如果 red + green = blue 的话,那么 red + (green / 2) 能得到更多的 coral 色:

这是另一个示例:

<filter id="lime">  <feColorMatrix    type="matrix"    values="1   0   0   0   0            0   2   0   0   0            0   0   0  .5   0            0   0   0   1   0 "/></filter>
登入後複製

有这么多值得探索的值。 Rachel Nabors 的 Dev Tools Challenger 就是一个很好的示例。( 注: 需要使用Firefox浏览器打开)。

酷!科学!颜色过滤器!现在,你对这方面知识有一定的了解。你现在所需要的是需要自己的工具来创建你自己的效果。

如果你想了解更多的细节,建议你阅读 Amelia Bellamy-Royds 写的 一篇文章 ,文章阐述了 feColorMatrix 更多的细节。 Sara Soueidan 也写了 一篇文章 ,在SVG中使用CSS的blend modes模式创建图像效果。

filter效果的参考

如查你理解了 feColorMatrix 是什么,你就可以在此基础上创建一个工具来生成过滤器效果。下面提供一些 fe- 相关的选项,希望对你有所帮助,并且能做进一步的探索。

  • feBlend :类似于 CSS blend modes ,描述了图像通过混合模式进行交互
  • feComponentTransfer : 改变个人对RGBA通道的总称(如 feFuncG )
  • feComposite :一个原始的过滤器, 定义像素图像交互方式
  • feConvolveMatrix :这个过滤器规定像素与他近邻将关闭交互(如:模糊、锐化)
  • feDiffuseLighting :定义了一个光源
  • feDisplacementMap : 使用另一个输入值( in2 )取代一个图像的像素值( in )
  • feFlood : 完成过滤器的填充区域指定的颜色和 alpha 等级
  • feGaussianBlur :输入的模糊值和标准值的偏差
  • feImage :使用其他的过滤器(像 feBlend 或 feComposite )
  • feMerge : 允许异步过滤效果应用,而不是分层
  • feMorphology : 削弱或扩张源图像
  • feOffset :用来创建阴影
  • feSpecularLighting : 通过 alpha 创建凹凸贴图,又将其称之为" 镜面 "( Phong Reflection Model )
  • feTile : 指图像如何重复填补空间
  • feTurbulence : 允许创建纹理

扩展阅读

  • MDN Docs on feColorMatrix
  • w3c Filter Docs
  • Smarter SVG Filters
  • feColorMatrix Overview on Web Platform
  • SVG 研究之路 (11) - filter:feColorMatrix

本文根据 @Una Kravets 的《 Finessing feColorMatrix 》所译,整个译文带有我们自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处: http://alistapart.com/article/finessing-fecolormatrix 。

大漠

常用昵称“大漠”,W3CPlus创始人,目前就职于手淘。中国Drupal社区核心成员之一。对HTML5、CSS3和Sass等前端脚本语言有非常深入的认识和丰富的实践经验,尤其专注对CSS3的研究,是国内最早研究和使用CSS3技术的一批人。CSS3、Sass和Drupal中国布道者。2014年出版《 图解CSS3:核心技术与案例实战 》。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

HTML:結構,CSS:樣式,JavaScript:行為 HTML:結構,CSS:樣式,JavaScript:行為 Apr 18, 2025 am 12:09 AM

HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

HTML,CSS和JavaScript的未來:網絡開發趨勢 HTML,CSS和JavaScript的未來:網絡開發趨勢 Apr 19, 2025 am 12:02 AM

HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

HTML的未來:網絡設計的發展和趨勢 HTML的未來:網絡設計的發展和趨勢 Apr 17, 2025 am 12:12 AM

HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

HTML與CSS vs. JavaScript:比較概述 HTML與CSS vs. JavaScript:比較概述 Apr 16, 2025 am 12:04 AM

HTML、CSS和JavaScript在網頁開發中的角色分別是:HTML負責內容結構,CSS負責樣式,JavaScript負責動態行為。 1.HTML通過標籤定義網頁結構和內容,確保語義化。 2.CSS通過選擇器和屬性控製網頁樣式,使其美觀易讀。 3.JavaScript通過腳本控製網頁行為,實現動態和交互功能。

HTML:建立網頁的結構 HTML:建立網頁的結構 Apr 14, 2025 am 12:14 AM

HTML是構建網頁結構的基石。 1.HTML定義內容結構和語義,使用、、等標籤。 2.提供語義化標記,如、、等,提升SEO效果。 3.通過標籤實現用戶交互,需注意表單驗證。 4.使用、等高級元素結合JavaScript實現動態效果。 5.常見錯誤包括標籤未閉合和屬性值未加引號,需使用驗證工具。 6.優化策略包括減少HTTP請求、壓縮HTML、使用語義化標籤等。

HTML的角色:構建Web內容 HTML的角色:構建Web內容 Apr 11, 2025 am 12:12 AM

HTML的作用是通過標籤和屬性定義網頁的結構和內容。 1.HTML通過到、等標籤組織內容,使其易於閱讀和理解。 2.使用語義化標籤如、等增強可訪問性和SEO。 3.優化HTML代碼可以提高網頁加載速度和用戶體驗。

HTML:是編程語言還是其他? HTML:是編程語言還是其他? Apr 15, 2025 am 12:13 AM

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增強WebevebDevelopment。

See all articles