Change color of PNG image via CSS?

后端 未结 16 1353
自闭症患者
自闭症患者 2020-11-22 07:33

Given a transparent PNG displaying a simple shape in white, is it possible to somehow change the color of this through CSS? Some kind of overlay or what not?

相关标签:
16条回答
  • 2020-11-22 07:45

    To literally change the color, you could incorporate a CSS transition with a -webkit-filter where when something happens you would invoke the -webkit-filter of your choice. For example:

    img {
        -webkit-filter:grayscale(0%);
        transition: -webkit-filter .3s linear;
        }
    img:hover 
        {
        -webkit-filter:grayscale(75%);
        }
    
    0 讨论(0)
  • 2020-11-22 07:46

    I've been able to do this using SVG filter. You can write a filter that multiplies the color of source image with the color you want to change to. In the code snippet below, flood-color is the color we want to change image color to (which is Red in this case.) feComposite tells the filter how we're processing the color. The formula for feComposite with arithmetic is (k1*i1*i2 + k2*i1 + k3*i2 + k4) where i1 and i2 are input colors for in/in2 accordingly. So specifying only k1=1 means it will do just i1*i2, which means multiplying both input colors together.

    Note: This only works with HTML5 since this is using inline SVG. But I think you might be able to make this work with older browser by putting SVG in a separate file. I haven't tried that approach yet.

    Here's the snippet:

    <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>

    0 讨论(0)
  • 2020-11-22 07:47

    You can use filters with -webkit-filter and filter: Filters are relatively new to browsers but supported in over 90% of browsers according to the following CanIUse table: https://caniuse.com/#feat=css-filters

    You can change an image to grayscale, sepia and lot more (look at the example).

    So you can now change the color of a PNG file with filters.

    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="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="original">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="saturate" class="saturate">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="grayscale" class="grayscale">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="contrast" class="contrast">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="brightness" class="brightness">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="blur" class="blur">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="invert" class="invert">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="sepia" class="sepia">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="huerotate" class="huerotate">
    <img alt="Mona Lisa" src="https://images.pexels.com/photos/40997/mona-lisa-leonardo-da-vinci-la-gioconda-oil-painting-40997.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260" title="opacity" class="rss opacity">

    Source

    0 讨论(0)
  • 2020-11-22 07:47

    I found this great codepen example that you insert your hex color value and it returns the needed filter to apply this color to png

    CSS filter generator to convert from black to target hex color

    for example i needed my png to have the following color #1a9790

    then you have to apply the following filter to you png

    filter: invert(48%) sepia(13%) saturate(3207%) hue-rotate(130deg) brightness(95%) contrast(80%);
    
    0 讨论(0)
  • 2020-11-22 07:52

    You might want to take a look at Icon fonts. http://css-tricks.com/examples/IconFont/

    EDIT: I'm using Font-Awesome on my latest project. You can even bootstrap it. Simply put this in your <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">
    

    And then go ahead and add some icon-links like this:

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

    Here's the full cheat sheet

    --edit--

    Font-Awesome uses different class names in the new version, probably because this makes the CSS files drastically smaller, and to avoid ambiguous css classes. So now you should use:

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

    EDIT 2:

    Just found out github also uses its own icon font: Octicons It's free to download. They also have some tips on how to create your very own icon fonts.

    0 讨论(0)
  • 2020-11-22 07:52

    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>

    Source: https://codepen.io/taryaoui/pen/EKkcu

    0 讨论(0)
提交回复
热议问题