我试图绘制多个矩形,然后屏蔽那些使用globalCompositeOperation‘源-in’-这是很好的工作,但问题是,当我填补我的矩形,他们消失了……如果我只有一个fill()调用,它们都会正确地绘制,但只尊重应用的最后一个填充样式。
有问题的代码-
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();以上代码正常工作。但如果我这么做,摘下面具-
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相同代码的矩形才能正常工作。
发布于 2013-10-22 17:03:03
解决了
我认为问题在于globalCompositeOperation的“消息来源”。最后我要做的是创建一个缓冲画布,然后在上面画出我的形状,然后将图像数据绘制到我的主画布中,并将GCO应用于此。
这是一个有用的小提琴- http://jsfiddle.net/ENtXs/5/
有关守则:
// 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;
}https://stackoverflow.com/questions/19520818
复制相似问题