通过CSS更改PNG图像的颜色?

时间:2011-09-14 11:53:06

标签: css image colors png overlay

鉴于透明的PNG显示白色的简单形状,是否有可能以某种方式通过CSS改变颜色?某种叠加或什么不是?

18 个答案:

答案 0 :(得分:479)

您可以使用-webkit-filterfilter的过滤条件: 过滤器对于浏览器来说是非常新的,仅在非常现代的浏览器中支持。 您可以将图像更改为灰度,棕褐色等等(请查看示例)。

现在,您可以使用过滤器更改PNG文件的颜色。

body {
    background-color:#03030a;
    min-width: 800px;
    min-height: 400px
}
img {
    width:20%;
    float:left; 
     margin:0;
}
/*Filter styles*/
.saturate { filter: saturate(3); }
.grayscale { filter: grayscale(100%); }
.contrast { filter: contrast(160%); }
.brightness { filter: brightness(0.25); }
.blur { filter: blur(3px); }
.invert { filter: invert(100%); }
.sepia { filter: sepia(100%); }
.huerotate { filter: hue-rotate(180deg); }
.rss.opacity { filter: opacity(50%); }
<!--- img src http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/500px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg -->
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="original">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="saturate" class="saturate">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="grayscale" class="grayscale">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="contrast" class="contrast">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="brightness" class="brightness">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="blur" class="blur">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="invert" class="invert">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="sepia" class="sepia">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="huerotate" class="huerotate">
<img alt="Mona Lisa" src="http://i.stack.imgur.com/OyP0g.jpg" title="opacity" class="rss opacity">

<子> Source

答案 1 :(得分:55)

您可能需要查看Icon字体。 http://css-tricks.com/examples/IconFont/

编辑:我在我的最新项目中使用Font-Awesome。你甚至可以引导它。只需将其放在<head>

<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css" rel="stylesheet">

<!-- And if you want to support IE7, add this aswell -->
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome-ie7.min.css" rel="stylesheet">

然后继续添加一些像这样的图标链接:

<a class="icon-thumbs-up"></a>

这是full cheat sheet

- 编辑 -

Font-Awesome在新版本中使用不同的类名,可能是因为这会使CSS文件显着缩小,并避免使用不明确的css类。 所以现在你应该使用:

<a class="fa fa-thumbs-up"></a>

编辑2:

刚刚发现github也使用自己的图标字体:Octicons 它可以免费下载。他们还对how to create your very own icon fonts提供了一些提示。

答案 2 :(得分:31)

我发现了一个很好的codepen示例,您插入了十六进制颜色值,它返回了所需的过滤器,以将该颜色应用于png

CSS filter generator to convert from black to target hex color

例如,我需要我的png具有以下颜色#1a9790

然后您必须对png应用以下过滤器

filter: invert(48%) sepia(13%) saturate(3207%) hue-rotate(130deg) brightness(95%) contrast(80%);

答案 3 :(得分:26)

img标签与其他标签一样具有背景属性。如果你有一个透明形状的白色PNG,比如模板,那么你可以这样做:

<img src= 'stencil.png' style= 'background-color: red'>

答案 4 :(得分:23)

我已经能够使用SVG过滤器完成此操作。您可以编写一个过滤器,将源图像的颜色与要更改的颜色相乘。在下面的代码段中, flood-color 是我们要将图像颜色更改为的颜色(在这种情况下为红色。)feComposite告诉过滤器我们如何处理颜色。具有算术的feComposite的公式是(k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4)其中i1和i2相应地是in / in2的输入颜色。因此,仅指定k1 = 1意味着它只会执行i1 * i2,这意味着将两种输入颜色相乘。

注意:这仅适用于HTML5,因为它使用的是内联SVG。但我认为通过将SVG放在一个单独的文件中,您可以使用旧版浏览器。我还没有尝试过这种方法。

以下是片段:

&#13;
&#13;
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
  <defs>
    <filter id="colorMask1">
      <feFlood flood-color="#ff0000" result="flood" />
      <feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
    </filter>
  </defs>
  <image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask1)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
  <defs>
    <filter id="colorMask2">
      <feFlood flood-color="#00ff00" result="flood" />
      <feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
    </filter>
  </defs>
  <image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask2)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="60" height="90" style="float:left">
  <defs>
    <filter id="colorMask3">
      <feFlood flood-color="#0000ff" result="flood" />
      <feComposite in="SourceGraphic" in2="flood" operator="arithmetic" k1="1" k2="0" k3="0" k4="0" />
    </filter>
  </defs>
  <image width="100%" height="100%" xlink:href="http://i.stack.imgur.com/OyP0g.jpg" filter="url(#colorMask3)" />
</svg>
&#13;
&#13;
&#13;

答案 5 :(得分:20)

是的:)

  

Surfin' Safari - Blog Archive » CSS Masks

     

WebKit现在支持CSS中的alpha掩码。蒙版允许您使用可用于在最终显示中敲除该框的部分的图案来覆盖框的内容。换句话说,您可以根据图像的alpha来剪切复杂的形状   [...]
  我们引入了新属性,为Web设计人员提供了对这些掩码及其应用方式的大量控制。新属性类似于已存在的背景和边框图像属性。

-webkit-mask (background)
-webkit-mask-attachment (background-attachment)
-webkit-mask-clip (background-clip)
-webkit-mask-origin (background-origin)
-webkit-mask-image (background-image)
-webkit-mask-repeat (background-repeat)
-webkit-mask-composite (background-composite)
-webkit-mask-box-image (border-image)

答案 6 :(得分:16)

most browsers中,您可以使用过滤器:

  • <img>元素和其他元素的背景图片

  • 并在CSS中静态设置,或使用JavaScript动态设置

请参阅下面的演示。

<img>个元素

您可以将此技术应用于<img>元素:

#original, #changed {
    width: 45%;
    padding: 2.5%;
    float: left;
}

#changed {
    -webkit-filter : hue-rotate(180deg);
    filter : hue-rotate(180deg);
}
<img id="original" src="http://i.stack.imgur.com/rfar2.jpg" />

<img id="changed" src="http://i.stack.imgur.com/rfar2.jpg" />

背景图片

您可以将此技术应用于背景图像:

#original, #changed {
    background: url('http://i.stack.imgur.com/kaKzj.jpg');
    background-size: cover;
    width: 30%;
    margin: 0 10% 0 10%;
    padding-bottom: 28%;
    float: left;
}

#changed {
    -webkit-filter : hue-rotate(180deg);
    filter : hue-rotate(180deg);
}
<div id="original"></div>

<div id="changed"></div>

的JavaScript

您可以使用JavaScript在运行时设置过滤器:

var element = document.getElementById("changed");
var filter = 'hue-rotate(120deg) saturate(2.4)';
element.style['-webkit-filter'] = filter;
element.style['filter'] = filter;
#original, #changed {
    margin: 0 10%;
    width: 30%;
    float: left;
    background: url('http://i.stack.imgur.com/856IQ.png');
    background-size: cover;
    padding-bottom: 25%;
}
<div id="original"></div>

<div id="changed"></div>

答案 7 :(得分:14)

认为我有一个解决方案,这是a)5年前你正在寻找的东西,b)比这里的其他代码选项更简单。

使用任何白色png(例如透明背景上的白色图标),您可以添加:: after选择器进行重新着色。

.icon {
    background: url(img/icon.png); /* Your icon */
    position: relative; /* Allows an absolute positioned psuedo element */
}

.icon::after{
    position: absolute; /* Positions psuedo element relative to .icon */
    width: 100%; /* Same dimensions as .icon */
    height: 100%;
    content: ""; /* Allows psuedo element to show */
    background: #EC008C; /* The color you want the icon to change to */
    mix-blend-mode: multiply; /* Only apply color on top of white, use screen if icon is black */
}

请参阅此codepen(在悬停时应用颜色交换):http://codepen.io/chrscblls/pen/bwAXZO

答案 8 :(得分:7)

我需要特定颜色,因此过滤器对我不起作用。

相反,我创建了一个div,利用CSS多个背景图像和线性渐变功能(它自己创建一个图像)。如果您使用叠加混合模式,您的实际图像将与生成的包含所需颜色的“渐变”图像混合(此处为#BADA55)

.colored-image {
        background-image: linear-gradient(to right, #BADA55, #BADA55), url("https://i.imgur.com/lYXT8R6.png");
        background-blend-mode: overlay;
        background-size: contain;
        width: 200px;
        height: 200px;        
    }
<div class="colored-image"></div>

答案 9 :(得分:6)

我在谷歌搜索时发现了这个问题,我发现最适合我的情况...

HTML

<div class="img"></div>

CSS

.img {
  background-color: red;
  width: 60px;
  height: 60px;
   -webkit-mask-image: url('http://i.stack.imgur.com/gZvK4.png');
}

http://jsfiddle.net/a63b0exm/

答案 10 :(得分:5)

将图片从黑色更改为白色或从白色更改为黑色时,色相旋转滤镜不起作用,因为从技术上讲黑色和白色不是颜色。相反,必须使用反转滤镜属性完成黑白颜色的更改(从黑色到白色,反之亦然)。

.img1 { filter: invert(100%); }

答案 11 :(得分:3)

回答是因为我正在寻找解决方案。

如果你有白色或黑色背景,那么@chrscblls中的笔答案效果很好,但我的不是。 Aslo,图像是用ng-repeat生成的,所以我不能在我的CSS中使用它们的URL,你不能在img标签上使用::。

所以,我想到了一个解决方案,并认为如果他们在这里绊倒它可能会有所帮助。

所以我所做的几乎完全相同,有三个主要区别:

  • 我的img标签中的url,我把它(和一个标签)放在另一个div上,其中:: after将起作用。
  • 'mix-blend-mode'设置为'difference'而不是'multiply'或'screen'。
  • 我添加了一个::之前具有完全相同的值,因此:: after将执行:: before之前的'差异'并取消它自我。

要将其从黑色更改为白色或从白色更改为黑色,背景颜色必须为白色。 从黑色到颜色,您可以选择任何颜色。 从白色到颜色,你需要选择你想要的颜色。

.divClass{
   position: relative;
   width: 100%;
   height: 100%;
   text-align: left;
}
.divClass:hover::after, .divClass:hover::before{
   position: absolute;
   width: 100%;
   height: 100%;
   background: #FFF;
   mix-blend-mode: difference;
   content: "";
}

https://codepen.io/spaceplant/pen/oZyMYG

答案 12 :(得分:3)

最适合我的一行:

filter: opacity(0.5) drop-shadow(0 0 0 blue);

您可以将不透明度从0调整为1,以使颜色更浅或更深。

答案 13 :(得分:3)

如果你只需要一个图标,就不需要一个完整的字体集,而且我觉得它作为一个单独的元素更“干净”。因此,为此,在HTML5中,您可以将SVG直接放在文档流中。然后,您可以在.CSS样式表中定义一个类,并使用fill属性访问其背景颜色:

工作小提琴: http://jsfiddle.net/qmsj0ez1/

请注意,在示例中,我使用:hover来说明行为;如果您只想更改“正常”状态的颜色,则应删除伪类。

答案 14 :(得分:2)

试试这个:

 -webkit-filter: brightness(0) invert(1);
 filter: brightness(0) invert(1); 

答案 15 :(得分:1)

body{
  background: #333 url(/images/classy_fabric.png);
  width: 430px;
  margin: 0 auto;
  padding: 30px;
}
.preview{
  background: #ccc;
  width: 415px;
  height: 430px;
  border: solid 10px #fff;
}

input[type='radio'] {
  -webkit-appearance: none;
  -moz-appearance: none;
  width: 25px;
  height: 25px;
  margin: 5px 0 5px 5px;
  background-size: 225px 70px;
  position: relative;
  float: left;
  display: inline;
  top: 0;
  border-radius: 3px;
  z-index: 99999;
  cursor: pointer;
  box-shadow: 1px 1px 1px #000;
}

input[type='radio']:hover{
  -webkit-filter: opacity(.4);
  filter: opacity(.4);    
}

.red{
  background: red;
}

.red:checked{
  background: linear-gradient(brown, red)
}

.green{
  background: green;
}

.green:checked{
  background: linear-gradient(green, lime);
}

.yellow{
  background: yellow;
}

.yellow:checked{
  background: linear-gradient(orange, yellow);
}

.purple{
  background: purple;
}

.pink{
  background: pink;
}

.purple:checked{
  background: linear-gradient(purple, violet);
}

.red:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 red);
  filter: opacity(.5) drop-shadow(0 0 0 red);
}

.green:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 green);
  filter: opacity(.5) drop-shadow(0 0 0 green);
}

.yellow:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 yellow);
  filter: opacity(.5) drop-shadow(0 0 0 yellow);
}

.purple:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 purple);
  filter: opacity(.5) drop-shadow(0 0 0 purple);
}

.pink:checked ~ img{
  -webkit-filter: opacity(.5) drop-shadow(0 0 0 pink);
  filter: opacity(.5) drop-shadow(0 0 0 pink);
}


img{
  width: 394px;
  height: 375px;
  position: relative;
}

.label{
  width: 150px;
  height: 75px;
  position: absolute;
  top: 170px;
  margin-left: 130px;
}

::selection{
  background: #000;
}
<div class="preview">
  <input class='red' name='color' type='radio' />
  <input class='green' name='color' type='radio' />
    <input class='pink' name='color' type='radio' />
  <input checked class='yellow' name='color' type='radio' />
  <input class='purple' name='color' type='radio' />  
  <img src="https://i.stack.imgur.com/bd7VJ.png"/>
</div>

来源:https://codepen.io/taryaoui/pen/EKkcu

答案 16 :(得分:0)

要从字面上改变颜色,你可以在-webkit-filter中加入CSS转换,当发生某些事情时你会调用你选择的-webkit-filter。例如:

img {
    -webkit-filter:grayscale(0%);
    transition: -webkit-filter .3s linear;
    }
img:hover 
    {
    -webkit-filter:grayscale(75%);
    }

答案 17 :(得分:0)

使用这个很棒的 codepen 示例,您插入十六进制颜色值并返回所需的过滤器以将此颜色应用于 png

用于从黑色转换为目标十六进制颜色的 CSS 过滤器生成器

例如,我需要我的 png 具有以下颜色 #EF8C57

那么你必须对你的png应用以下过滤器 结果:

filter: invert(76%) sepia(30%) saturate(3461%) hue-rotate(321deg) brightness(98%) contrast(91%);