목차
CSS vs. SVG
SVG filters
filters的使用
feColorMatrix
RGB值
着色
混合通道
ALPHA值
Blowing out channels
Lighten 和 darken
GRAYSCALE
组合在一起
filter效果的参考
扩展阅读
大漠
웹 프론트엔드 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? 뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? Mar 20, 2025 pm 05:56 PM

이 기사는 모바일 장치의 반응 형 웹 디자인에 필수적인 Viewport Meta Tag에 대해 설명합니다. 적절한 사용이 최적의 컨텐츠 스케일링 및 사용자 상호 작용을 보장하는 방법을 설명하는 반면, 오용은 설계 및 접근성 문제로 이어질 수 있습니다.

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? Mar 12, 2025 pm 04:05 PM

이 기사는 html5 & lt; time & gt; 시맨틱 날짜/시간 표현 요소. 인간이 읽을 수있는 텍스트와 함께 기계 가독성 (ISO 8601 형식)에 대한 DateTime 속성의 중요성을 강조하여 Accessibilit를 향상시킵니다.

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? & lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? Mar 20, 2025 pm 06:05 PM

이 기사는 & lt; iframe & gt; 외부 컨텐츠를 웹 페이지, 공통 용도, 보안 위험 및 객체 태그 및 API와 같은 대안을 포함시키는 태그의 목적.

See all articles