首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在画布中使用globalCompositeOperation掩蔽多种形状

在画布中使用globalCompositeOperation掩蔽多种形状
EN

Stack Overflow用户
提问于 2013-10-22 14:33:48
回答 1查看 2.7K关注 0票数 6

我试图绘制多个矩形,然后屏蔽那些使用globalCompositeOperation‘源-in’-这是很好的工作,但问题是,当我填补我的矩形,他们消失了……如果我只有一个fill()调用,它们都会正确地绘制,但只尊重应用的最后一个填充样式。

有问题的代码-

代码语言:javascript
复制
ctx.drawImage(self.glass.mask, 256, 375);
ctx.globalCompositeOperation = 'source-in';

ctx.rect(256, 635, 256, 75);
ctx.fillStyle = "#c65127";

ctx.rect(256, 605, 256, 25);
ctx.fillStyle = "#f5f4f0";

ctx.rect(256, 565, 256, 35);
ctx.fillStyle = "#c65127";

ctx.fill();

以上代码正常工作。但如果我这么做,摘下面具-

代码语言:javascript
复制
ctx.beginPath();
ctx.rect(0, 256, 256, 75);
ctx.fillStyle = "#c65127";
ctx.fill();

ctx.beginPath();
ctx.rect(0, 226, 256, 25);
ctx.fillStyle = "#f5f4f0";
ctx.fill();

ctx.beginPath();
ctx.rect(0, 186, 256, 35);
ctx.fillStyle = "#222";
ctx.fill();

我有每个矩形,他们尊重他们的填充风格。问题是,当我启用掩码时,它们不再可见。

您在globalCompositeOperation 'source-in‘下可以拥有的元素的数量是否有限制?还是我只是遗漏了一些简单的东西?

这里有一些小提琴-

http://jsfiddle.net/ENtXs/ -按预期工作,但不尊重填充样式。

http://jsfiddle.net/ENtXs/1/ -删除掩码以显示所有元素

http://jsfiddle.net/ENtXs/2/ -添加beginPath()和fill()元素尊重填充样式。(无掩蔽)

http://jsfiddle.net/ENtXs/3/ -添加掩码回(什么都没有出现)

http://jsfiddle.net/ENtXs/4/ -只有一个与#3相同代码的矩形才能正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-22 17:03:03

解决了

我认为问题在于globalCompositeOperation的“消息来源”。最后我要做的是创建一个缓冲画布,然后在上面画出我的形状,然后将图像数据绘制到我的主画布中,并将GCO应用于此。

这是一个有用的小提琴- http://jsfiddle.net/ENtXs/5/

有关守则:

代码语言:javascript
复制
// Canvas and Buffers
var canvas = document.getElementById('canvas');
var buffer = document.getElementById('buffer');
var ctx = canvas.getContext('2d');
var buffer_ctx = buffer.getContext('2d');

// sizing
canvas.height = window.innerHeight;
canvas.width = window.innerWidth;

buffer.height = window.innerHeight;
buffer.width = window.innerWidth;

// mask image
var mask = new Image();
mask.onload = function () {
    drawBuffer();
}

mask.src = 'http://drewdahlman.com/experiments/masking/highball_mask.png';

function drawBuffer() {
    buffer_ctx.beginPath();
    buffer_ctx.rect(0, 256, 256, 75);
    buffer_ctx.fillStyle = "#c65127";
    buffer_ctx.fill();

    buffer_ctx.beginPath();
    buffer_ctx.rect(0, 226, 256, 25);
    buffer_ctx.fillStyle = "#f5f4f0";
    buffer_ctx.fill();

    buffer_ctx.beginPath();
    buffer_ctx.rect(0, 186, 256, 35);
    buffer_ctx.fillStyle = "#222";
    buffer_ctx.fill();

    var image = buffer.toDataURL("image/png");
    var img = new Image();
    img.onload = function(){
        buffer_ctx.clearRect(0,0,buffer.width,buffer.height);
        ctx.drawImage(mask,0,0);
        ctx.globalCompositeOperation = 'source-in';
        ctx.drawImage(img,0,0);
    }
    img.src = image;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19520818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档