globalCompositeOperation 影响到所有层?

Posted

技术标签:

【中文标题】globalCompositeOperation 影响到所有层?【英文标题】:The globalCompositeOperation affected to all layers? 【发布时间】:2021-07-26 03:53:14 【问题描述】:

我有一个简单的代码,我想为播放器创建掩码。

ctx.clearRect(0, 0, canvas.width, canvas.height); 
ctx.drawImage(level1, 0, 0);
ctx.save();
ctx.fillRect(0,0,mask.width,mask.height);
ctx.globalCompositeOperation="source-in";
ctx.drawImage(hero,0,0);
ctx.restore();

但是 globalCompositeOperation 影响了关卡背景。它认为level1背景是掩码二。如何解决这个问题?谢谢。

【问题讨论】:

【参考方案1】:

很难说出你想要什么。

// clear the whole canvas
ctx.clearRect(0, 0, canvas.width, canvas.height); 
// draw image at top left covering part or all of the canvas
ctx.drawImage(level1, 0, 0);

ctx.save();
// fill part of all of the canvas including the drawn image with black
ctx.fillRect(0,0,mask.width,mask.height);

ctx.globalCompositeOperation="source-in";
//draw image where each pixel in the hero image get the hero colour RGB and the
// source alpha.
ctx.drawImage(hero,0,0);
ctx.restore();

如果遮罩的宽度和高度与画布相同,那么您只会看到英雄图像。

也许您只希望英雄图像为黑色,同时保持关卡图像?

ctx.clearRect(0, 0, canvas.width, canvas.height); 
ctx.fillRect(0,0,mask.width,mask.height);
ctx.globalCompositeOperation="destination-in"; 
ctx.drawImage(hero,0,0);
ctx.globalCompositeOperation = "source-over"; // reset default
ctx.drawImage(level1, 0, 0);

如果你想要,但黑色英雄像素后面的 level1 图像

ctx.clearRect(0, 0, canvas.width, canvas.height); 
ctx.fillRect(0,0,mask.width,mask.height);
ctx.globalCompositeOperation="destination-in"; 
ctx.drawImage(hero,0,0);
ctx.globalCompositeOperation="destination-over"; 
ctx.drawImage(level1, 0, 0);
ctx.globalCompositeOperation = "source-over"; // reset default

如果你想要别的东西,你将不得不多解释一点,或者给出一个你想要什么和你得到什么的示例图片。

在很多情况下,您无法在一张画布上完成所有合成。在这些情况下,您将创建第二个屏幕外画布

var offScrCan = document.createElement("canvas");
offScrCan.width = canvas.width;
offScrCan.height = canvas.height;
var ctx1 = offScrCan.getContext("2d");

在屏幕外画布上进行合成,然后在显示画布上绘制该画布

ctx.drawImage(offScrCan,0,0);

【讨论】:

以上是关于globalCompositeOperation 影响到所有层?的主要内容,如果未能解决你的问题,请参考以下文章

Canvas学习:globalCompositeOperation详解

webgl 中的 globalcompositeoperation 等效项

在画布中使用 globalCompositeOperation 屏蔽多个形状

分几个阶段使用 globalCompositeOperation

画布 globalCompositeOperation 无法正常工作

globalCompositeOperation 影响到所有层?