如何使用alpha = 0
绘制HTML5画布?想象一下,我正在制作一个photoshop克隆,我有一层坚固的红色。我选择橡皮擦工具并绘制。它吸引rgba(0,0,0,0)
让我透视背景。我如何在HTML5 Canvas中执行此操作?
这是一些代码。
var rand = function(v) {
return Math.random() * v;
};
var canvas = document.getElementsByTagName("canvas")[0];
var ctx = canvas.getContext("2d");
// fill the canvas with black
ctx.fillStyle = "red";
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Erase some circles (draw them in 0,0,0,0);
ctx.fillStyle = "rgba(0,0,0,0)";
ctx.globalCompositeOperation = "copy";
for (var ii = 0; ii < 5; ++ii) {
ctx.beginPath();
ctx.arc(rand(canvas.width), rand(canvas.height),
rand(50) + 20, 0, 360, false);
ctx.fill();
}
/*
source-over
source-in
source-out
source-atop
destination-over
destination-in
destination-out
destination-atop
lighter
darker
copy
xor
*/
canvas {
margin: 10px;
border: 1px solid black;
background-color: yellow;
}
<div>Want red with yellow circles</div>
<canvas></canvas>
这不起作用。所有画布操作都被认为是无限大的,这意味着绘制每个圆(弧),globalCompositeOperation
设置为“复制”有效地擦除每个圆圈之外的所有内容。
我可能能够设置剪裁以匹配圆圈,但理想情况下我希望能够使用消除锯齿的圆圈进行擦除,就像使用Photoshop笔刷一样。
答案 0 :(得分:4)
您想要使用:
ctx.fillStyle = "rgba(0,0,0,1)"; // (Drawing with 0 alpha pretty much means doing nothing)
ctx.globalCompositeOperation = "destination-out";
<强> Working Example 强>
请注意保存以前的globalCompositeOperation
并将其恢复,否则透明度将无法正常使用。
问题在于&#34;在画布上使用alpha=0
绘图只是覆盖了一个不可见的&#34;墨水&#34;,默认情况下。
答案 1 :(得分:0)
如果你必须流利地擦除,那么当单击鼠标并移动此行时应该删除,这可能是一个解决方案:
var canvas = document.getElementById("myCanvas");
var eraseWidth = 5;
$("#myCanvas").mousedown(function(canvas){ //the mousedown (writing) handler, this handler does not draw, it detects if the mouse is down (see mousemove)
x = canvas.pageX-this.offsetLeft;
y = canvas.pageY-this.offsetTop;
});
$("#myCanvas").mousemove(function(canvas){
context.beginPath();
var x2 = x-(eraseWidth/2); //x2 is used to center the erased rectangle at the mouse point
var y2 = y-(eraseWidth/2); //y2 is used to center the erased rectangle at the mouse point
context.clearRect(x2, y2, eraseWidth, eraseWidth); //clear the rectangle at the mouse point (x2 and y2)
context.closePath();
};
基本上,当鼠标移动时,它会清除一个矩形,每次mousehandler发送一个mousemove事件并使用画布中心的x和y坐标来清除重复。结果是清除(擦除)线。
好吧,如果移动太快,你可以看到矩形,但我的项目是一个概念,所以它为我做了诀窍;)答案 2 :(得分:0)
如果您正在开发类似于photoshop克隆的东西,那么最好为每个图层创建一个画布。我认为这会大大简化你的一切,同时为你提供更好的表现。