如何在画布上重新着色灰度图像

时间:2016-08-26 20:28:23

标签: javascript image colors html5-canvas

在画布上绘制灰度图标(带透明背景的png图像)时,有没有快速的方法可以着色?通过着色我的意思是将灰度图标变成绿色标尺(给定颜色的阴影而不是灰色以匹配给定的颜色主题)

我知道我可以手动操作每个像素,但也许有一些更自动化的方式?

3 个答案:

答案 0 :(得分:7)

使用合成将灰度图像重新着色为" greenscale"。

使用合成比像素操作更快,作为奖励,您不会违反跨域安全限制(如果您改为使用getImageData,则会这样做。)

  1. 创建图片的完全绿色版本。
  2. 在画布上绘制灰度图像。
  3. 设置globalCompositeOperation='color',使现有的灰度像素重新着色("重新调整"),顶部显示像素。
  4. 在画布上绘制完全绿色的图像。
  5. <强>&#34;颜色&#34;合成将灰度变为绿色。

    enter image description here + enter image description here = enter image description here

    注意:需要具有混合功能的现代浏览器(Edge not IE)

    示例代码和演示:

    &#13;
    &#13;
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    var cw=canvas.width;
    var ch=canvas.height;
    
    var img=new Image();
    img.onload=start;
    img.src="https://dl.dropboxusercontent.com/u/139992952/multple/koolBW.png";
    function start(){
    
        // create a fully green version of img
        var c=document.createElement('canvas');
        var cctx=c.getContext('2d');
        c.width=img.width;
        c.height=img.height;
        cctx.drawImage(img,0,0);
        cctx.globalCompositeOperation='source-atop';
        cctx.fillStyle='green';
        cctx.fillRect(0,0,img.width,img.height);  
        cctx.globalCompositeOperation='source-over';
    
        // draw the grayscale image onto the canvas
        ctx.drawImage(img,0,0);
    
        // set compositing to color (changes hue with new overwriting colors) 
        ctx.globalCompositeOperation='color';
    
        // draw the fully green img on top of the grayscale image
        // ---- the img is now greenscale ----
        ctx.drawImage(c,0,0);
        
        // Always clean up -- change compositing back to default
        ctx.globalCompositeOperation='source-over';
    }
    &#13;
    body{ background-color:white; }
    #canvas{border:1px solid red; }
    &#13;
    <canvas id="canvas" width=256 height=256></canvas>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:2)

您可以使用css类来实现它。检查以下示例P.S:来源:w3Schools

&#13;
&#13;
img {
  width: 33%;
  height: auto;
  float: left;
  max-width: 235px;
}
.blur {
  -webkit-filter: blur(4px);
  filter: blur(4px);
}
.brightness {
  -webkit-filter: brightness(250%);
  filter: brightness(250%);
}
.contrast {
  -webkit-filter: contrast(180%);
  filter: contrast(180%);
}
.grayscale {
  -webkit-filter: grayscale(100%);
  filter: grayscale(100%);
}
.huerotate {
  -webkit-filter: hue-rotate(180deg);
  filter: hue-rotate(180deg);
}
.invert {
  -webkit-filter: invert(100%);
  filter: invert(100%);
}
.opacity {
  -webkit-filter: opacity(50%);
  filter: opacity(50%);
}
.saturate {
  -webkit-filter: saturate(7);
  filter: saturate(7);
}
.sepia {
  -webkit-filter: sepia(100%);
  filter: sepia(100%);
}
.shadow {
  -webkit-filter: drop-shadow(8px 8px 10px green);
  filter: drop-shadow(8px 8px 10px green);
}
&#13;
<body>

  <p><strong>Note:</strong> The filter property is not supported in Internet Explorer, Edge 12, or Safari 5.1 and earlier.</p>

  <img src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="blur" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="brightness" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="contrast" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="grayscale" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="huerotate" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="invert" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="opacity" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="saturate" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="sepia" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">
  <img class="shadow" src="http://www.supercoloring.com/sites/default/files/styles/how_to_draw_medium/public/htd/2015/07/pineapple-0-how-to-draw.png" alt="Pineapple" width="300" height="300">

</body>
&#13;
&#13;
&#13;

请参阅此链接以了解过滤器样式可以执行的操作。

ClickMe

答案 2 :(得分:2)

嘿试试这个替代方案!

首先创建一个canvas元素并使用canvas上下文来绘制图像。您可以使用画布筛选器来应用效果。然后使用toDataURL方法获取图像的png。所有详细程序将在以下网站中解释。

http://www.html5canvastutorials.com/advanced/html5-canvas-grayscale-image-colors-tutorial/

最后使用.toDataURL()方法导出/保存它。

希望它适合你!