利用CSS改变图片颜色的多种方法!

前言

“说到对图片进行处理,咱们常常会想到PhotoShop这类的图像处理工具。做为前端开发者,咱们常常会须要处理一些特效,例如根据不一样的状态,让图标显示不一样的颜色。或者是hover的时候,对图片的对比度,阴影进行处理。”css

你觉得这些是通过PS软件处理出来的?不不不,纯粹的是用css写出来的,很神奇把。
html

强大的 CSS:filter

CSS滤镜(filter)属提供的图形特效,像模糊,锐化或元素变色。过滤器一般被用于调整图片,背景和边界的渲染。 MDN前端

CSS标准里包含了一些已实现预约义效果的函数。css3

filter: none        
    | blur() 
    | brightness() 
    | contrast() 
    | drop-shadow() 
    | grayscale() 
    | hue-rotate() 
    | invert() 
    | opacity() 
    | saturate() 
    | sepia() 
    | url();
复制代码
<!--html-->
<img src="https://note.youdao.com/yws/res/237/WEBRESOURCE7e77df2551fe1a1db1b9d91f4d518917" alt="原图">
复制代码


filter: none

没有任何效果,默认filter就为noneweb

filter:blur( ) 高斯模糊

给图像一个高斯模糊效果,length值越大,图像越模糊面试

咱们来尝试一下浏览器

img {
    filter:blur(2px);;
}
复制代码



brightness(%) 线性乘法

可让图片看起来更亮或者更暗bash

img {
    filter:brightness(70%);
}复制代码


contrast(%) 对比度

调整图像的对比度。微信

img {
    filter:contrast(50%);
}复制代码


drop-shadow(h-shadow v-shadow blur spread color)

给图像设置一个阴影效果。阴影是合成在图像下面,能够有模糊度的,能够以特定颜色画出的遮罩图的偏移版本。 函数接受<shadow>(在CSS3背景中定义)类型的值,除了"inset"关键字是不容许的。该函数与已有的box-shadow box-shadow属性很类似;不一样之处在于,经过滤镜,一些浏览器为了更好的性能会提供硬件加速svg

利用这个方案,咱们其实改变相似于一些图标的颜色,好比黑色的图标变成蓝色的图标。

PNG格式小图标的CSS任意颜色赋色技术

img {
    filter: drop-shadow(705px 0 0 #ccc);
}
复制代码

在这里,咱们将图片投影造成一个同等大小的灰色区域。 


hue-rotate(deg) 色相旋转

img {
    filter:hue-rotate(70deg);
}
复制代码

看,个人小姐姐变成了阿凡达! 


invert(%) 反转

这个函数的做用是反转输入图像,有点像曝光的效果

img {
    filter:invert(100%)
}
复制代码


grayscale(%) 将图像转换为灰度图像

这个效果能够将图片作旧,有一种时代沧桑感。喜欢古风的人必定会喜欢上这个效果的

img {
    filter:grayscale(80%);
}复制代码


除了古风还有一种用法是有的时候须要将全站变成灰色,如大屠杀记念日的时候。


能够这样设置

*{
    filter: grayscale(100%);
    -webkit-filter: grayscale(100%);
    -moz-filter: grayscale(100%);
    -ms-filter: grayscale(100%);
    -o-filter: grayscale(100%);
}
复制代码

sepia(%) 将图像转换为深褐色

下面给个人小姐姐一个暖暖的色调。

img {
    filter:sepia(50%)
}
复制代码


你们是否是发现我并无把url()方法写到这上面来

没错,由于我想把这个内容放到最后来讲,filter:url()就是css滤镜改变图片的终极方法。CSS:filter能够导入一个svg滤镜,做为他本身的滤镜。

终极变色解决方案! filter:url();

为何说filter:url()是图片变色的终极解决方案呢,请容我慢慢道来。

咱们先科普一下PS的工做原理,咱们都知道网页是有三原色的R(红) G(绿) B(蓝),常见的RGBA还包括一个opicity值,而opcity值是根据alpha通道计算出来的。也就是说,咱们见到的网页的每个像素点都是由红蓝绿再加alpha四个通道组成,每个通道咱们称之为色板,PS中的8位板的意思就是2的八次方256,意思就是每个通道的取值范围都是(0-255) SVG 研究之路 (11) - filter:feColorMatrix

若是咱们能够改变每一个通道的值是否是就能完美的获得咱们想要的任意颜色了呢,原理上,咱们能够像ps那样利用svg滤镜获得任何咱们想要的图像,不只仅是变色。咱们甚至能够凭空生成一幅图像。

svg feColorMatrix大法好

<svg height="0" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <filter id="change">
                <feColorMatrix type="matrix" values=" 0 0 0 0 0.55 0 0 0 0 0.23 0 0 0 0 0 0 0 0 0 1" />
        </filter>
    </defs>
</svg>
<img src="https://note.youdao.com/yws/res/237/WEBRESOURCE7e77df2551fe1a1db1b9d91f4d518917" alt="">

复制代码
img {
    filter:url(#change);
}
复制代码

经过单通道咱们能够将图片变成单一的颜色 


<svg height="0" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <filter id="change">
               <feColorMatrix values="3 -1 -1 0 0 -1 3 -1 0 0 -1 -1 3 0 0 0 0 0 1 0" />
        </filter>
    </defs>
</svg>
复制代码

经过双通道咱们能够的到一些很是炫酷的PS效果


固然,在这里,只是举个例子,经过配置矩阵中的值,咱们能够配置每个像素点的值按照咱们定义的规则显示

咱们在这里详细讲一下feColorMatrix 矩阵的计算方式


其中Rin Gi

n Bin a(alpha) 为原始图片中每一个像素点的rgba值

经过矩阵计算,获得的Rout Gout Bout Aout就是最终显示出来的rgba值。

将图片转为单色 拿棕色rgba(140,59,0,1)做为例子

根据上面的公式,咱们能够简化一些计算,同一行中,只设置一个通道的值,其余通道为0

不可贵出矩阵

0 0 0 0 目标值R
0 0 0 0 目标值G
0 0 0 0 目标值B
0 0 0 0 1
复制代码

根据规则,只须要计算,255/想要显示的颜色对应通道 = 目标值

咱们想要的棕色rgba(140,59,0,1) 换算成色板 rgba 为 140 59 0 255

能够算出目标值

0 0 0 0 0.55
0 0 0 0 0.23
0 0 0 0 0 
0 0 0 0 1
复制代码

多通道设置出炫酷的效果来

就如同以前咱们看到的双通道造成的炫酷图片通常

我們今天要把圖片的飽和度提升,該怎麼作呢?首先當然是想一想飽和度的成因,就是紅的越紅,藍的越藍,綠的越綠,由這個成因出發,我們的矩陣就能够寫成下面的樣子,看到矩陣當中出現了 3 和 -1,必定會很那悶這是怎麼來的,箇中原理其實很容易理解,讓我們假設某一個像素的 RGB 分別是 (200/255),(100/255),(50/255),呈現的應該是有點暗沉的橘色,經過矩陣的換算,R 變成了 200/255x3-100/255-50/255= 1.76, G 變成 200/255x(-1)+100/255*3-50/255=0.2,B 變成 200x(-1)+100x(-1)+50x3=-0.59,所以 RGB 轉換後就是:200x1.76,100x0.2,50x-0.5。SVG 研究之路 (11) - filter:feColorMatrix

<svg height="0" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <filter id="change">
               <feColorMatrix values="3 -1 -1 0 0 -1 3 -1 0 0 -1 -1 3 0 0 0 0 0 1 0" />
        </filter>
    </defs>
</svg>
复制代码

其余方案

除了feColorMatrix svg滤镜还有不少的方法能够定义滤镜,他们一样能够做用到图片上。因为篇幅限制,这里就不详细展开了

总结

  • css3提供了filter这个属性,使得经过前端技术实现更多炫酷的特效成为了可能
  • 依赖于svg的滤镜,咱们能够实现复杂的滤镜效果

注意

  • css:filter与ie上的filter并非相同的概念
  • css:filter在不一样的浏览器上兼容性不同,您在使用的时候须要注意浏览器的兼容性 

参考文献

写在最后

本次源码我已经放在了codePen上 codepen.io/nanhupatar/… 欢迎查看

文章不免会有疏漏,但愿你们可以指正批评

安利本身的微信公众号:前端指南

主要是分享前端面试题,前端资讯,以及本身写的一些文章,基本上天天早上6点钟就会更新,欢迎你们关注。


转载请注明出处与做者,原创不易,欢迎转载

相关文章
相关标签/搜索