Convert an image to grayscale in HTML/CSS

前端 未结 25 1450
青春惊慌失措
青春惊慌失措 2020-11-22 10:22

Is there a simple way to display a color bitmap in grayscale with just HTML/CSS?

It doesn\'t need to be IE-compatible (and I imagine it won\'t be) -- if

相关标签:
25条回答
  • 2020-11-22 10:41

    Just got the same problem today. I've initially used SalmanPK solution but found out that effect differs between FF and other browsers. That's because conversion matrix works on lightness only not luminosity like filters in Chrome/IE . To my surprise I've found out that alternative and simpler solution in SVG also works in FF4+ and produces better results:

    <svg xmlns="http://www.w3.org/2000/svg">
      <filter id="desaturate">
        <feColorMatrix type="saturate" values="0"/>
      </filter>
    </svg>
    

    With css:

    img {
        filter: url(filters.svg#desaturate); /* Firefox 3.5+ */
        filter: gray; /* IE6-9 */
        -webkit-filter: grayscale(1); /* Google Chrome & Safari 6+ */
    }
    

    One more caveat is that IE10 doesn't support "filter: gray:" in standards compliant mode anymore, so needs compatibility mode switch in headers to work:

    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    
    0 讨论(0)
  • 2020-11-22 10:42

    In Internet Explorer use the filter property.

    In webkit and Firefox there is currently no way to desatuarte an image solely with CSS. so you will need to use either canvas or SVG for a client side solution.

    But I think using SVG is more elegant. check out my blog post for the SVG solution that works for both Firefox and webkit: http://webdev.brillout.com/2010/10/desaturate-image-without-javascript.html

    And strictly speaking since SVG is HTML the solution is pure html+css :-)

    0 讨论(0)
  • 2020-11-22 10:42

    It's in fact easier to do it with IE if I remember correctly using a proprietary CSS property. Try this FILTER: Gray from http://www.ssi-developer.net/css/visual-filters.shtml

    The method by Ax simply makes the image transparent and has a black background behind it. I'm sure you could argue this is grayscale.

    Although you didn't want to use Javascript, I think you'll have to use it. You could also use a server side language to do it.

    0 讨论(0)
  • 2020-11-22 10:43

    As a complement to other's answers, it's possible to desaturate an image half the way on FF without SVG's matrix's headaches:

    <feColorMatrix type="saturate" values="$v" />
    

    Where $v is between 0 and 1. It's equivalent to filter:grayscale(50%);.

    Live example:

    .desaturate {
        filter: url("#desaturate");
        -webkit-filter: grayscale(50%);
    }
    figcaption{
        background: rgba(55, 55, 136, 1);
        padding: 4px 98px 0 18px;
        color: white;
        display: inline-block;
        border-top-left-radius: 8px;
        border-top-right-radius: 100%;
        font-family: "Helvetica";
    }
    <svg version="1.1" xmlns="http://www.w3.org/2000/svg">
      <filter id="desaturate">
      	<feColorMatrix type="saturate" values="0.4"/>
      </filter>
    </svg>
    
    <figure>
      <figcaption>Original</figcaption>
      <img src="http://www.placecage.com/c/500/200"/>
      </figure>
    <figure>
      <figcaption>Half grayed</figcaption>
      <img class="desaturate" src="http://www.placecage.com/c/500/200"/>
    </figure>

    Reference on MDN

    0 讨论(0)
  • 2020-11-22 10:44

    be An alternative for older browser could be to use mask produced by pseudo-elements or inline tags.

    Absolute positionning hover an img (or text area wich needs no click nor selection) can closely mimic effects of color scale , via rgba() or translucide png .

    It will not give one single color scale, but will shades color out of range.

    test on code pen with 10 different colors via pseudo-element, last is gray . http://codepen.io/gcyrillus/pen/nqpDd (reload to switch to another image)

    0 讨论(0)
  • 2020-11-22 10:45

    For people who are asking about the ignored IE10+ support in other answers, checkout this piece of CSS:

    img.grayscale:hover {
        filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0\'/></filter></svg>#grayscale");
    }
    
    svg {
        background:url(http://4.bp.blogspot.com/-IzPWLqY4gJ0/T01CPzNb1KI/AAAAAAAACgA/_8uyj68QhFE/s400/a2cf7051-5952-4b39-aca3-4481976cb242.jpg);
    }
    
    svg image:hover {
        opacity: 0;
    }
    

    Applied on this markup:

    <!DOCTYPE HTML>
    <html>
    <head>
    
        <title>Grayscaling in Internet Explorer 10+</title>
    
    </head>
    <body>
    
        <p>IE10 with inline SVG</p>
        <svg xmlns="http://www.w3.org/2000/svg" id="svgroot" viewBox="0 0 400 377" width="400" height="377">
          <defs>
             <filter id="filtersPicture">
               <feComposite result="inputTo_38" in="SourceGraphic" in2="SourceGraphic" operator="arithmetic" k1="0" k2="1" k3="0" k4="0" />
               <feColorMatrix id="filter_38" type="saturate" values="0" data-filterid="38" />
            </filter>
          </defs>
          <image filter="url(&quot;#filtersPicture&quot;)" x="0" y="0" width="400" height="377" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://4.bp.blogspot.com/-IzPWLqY4gJ0/T01CPzNb1KI/AAAAAAAACgA/_8uyj68QhFE/s1600/a2cf7051-5952-4b39-aca3-4481976cb242.jpg" />
        </svg>
    
    </body>
    </html>
    

    For more demos, checkout IE testdrive's CSS3 Graphics section and this old IE blog http://blogs.msdn.com/b/ie/archive/2011/10/14/svg-filter-effects-in-ie10.aspx

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