How to re-tint a grayscale image on canvas(如何在画布上重新着色灰度图像)
问题描述
在画布上绘制灰度图标(具有透明背景的 png 图像)时,是否有任何快速着色的方法?通过着色我的意思是把灰度图标变成绿色(给定颜色而不是灰色的阴影来匹配给定的颜色主题)
Is there any quick way to colorize greyscale icon (png image with transparent background) when drawing it on canvas? By colorize I mean turning greyscale icon into lets say greenscale (shades of given color instead of grey to match given color theme)
我知道我可以手动操作每个像素,但也许有一些更自动化的方法?
I know I could manipulate each pixel manually but maybe there's some more automated way?
推荐答案
使用合成将灰度图像重新着色为greenscale".
使用合成比像素操作更快,并且作为奖励,您不会违反跨域安全限制(如果您使用 getImageData
则可以这样做).
Using compositing is faster than pixel manipulation and as a bonus you won't run afoul of cross-domain security restrictions (which you do if you instead used getImageData
).
- 为您的图片创建一个完全绿色的版本.
- 在画布上绘制灰度图像.
- 设置
globalCompositeOperation='color'
,这会使现有灰度像素重新着色(重新着色"),并在顶部绘制像素. - 在画布上绘制您的全绿色图像.
- Create a fully green version of your image.
- Draw your grayscale image on the canvas.
- Set
globalCompositeOperation='color'
which causes existing grayscale pixels to be re-tinted ("re-hued") with pixels drawn on top. - Draw your fully green image on the canvas.
颜色"合成会将灰度变为绿色.
+ =
注意:需要具有混合功能的现代浏览器(Edge 而不是 IE)
示例代码和演示:
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="aHR0cHM6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMTM5OTkyOTUyL211bHRwbGUva29vbEJXLnBuZw==";
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';
}
body{ background-color:white; }
#canvas{border:1px solid red; }
<canvas id="canvas" width=256 height=256></canvas>
这篇关于如何在画布上重新着色灰度图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在画布上重新着色灰度图像


- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- 400或500级别的HTTP响应 2022-01-01
- Flexslider 箭头未正确显示 2022-01-01
- 失败的 Canvas 360 jquery 插件 2022-01-01
- addEventListener 在 IE 11 中不起作用 2022-01-01
- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- Fetch API 如何获取响应体? 2022-01-01
- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01