添加 transparency/alpha 到 canvas 覆盖现有颜色
Adding transparency/alpha to canvas overwriting existing color
我正在尝试用 canvas 创建一个月亮形状。为此,我创建了两个圆圈:一个用我的颜色填充,另一个用 globalCompositionOperation: "destination-out"
.
减去
const moonCanvas = createCanvas(WIDTH, HEIGHT);
const moonCtx = canvas.getContext("2d");
moonCtx.beginPath();
moonCtx.arc(WIDTH / 2, HEIGHT / 2, HEIGHT / 4, 0, 2 * Math.PI);
moonCtx.fill();
moonCtx.globalCompositeOperation = "destination-out";
moonCtx.beginPath();
moonCtx.arc(WIDTH / 2 + 30, HEIGHT / 2, HEIGHT / 4, 0, 2 * Math.PI);
moonCtx.fill();
这是一个 fiddle 的最小复制:https://jsfiddle.net/h2qbytzn/
现在的问题是此操作向 canvas 添加了“显式”透明度。每当我想将月亮添加到另一个 canvas 时,它也会包括透明部分,从而覆盖那里已经存在的部分 canvas。
有没有办法在忽略透明部分的情况下导入 canvas 内容?
现在对我有用的是创建第二个 canvas,在那里绘制我的对象并将它们合并到原始 canvas 中 drawImage
:
const c2 = createCanvas(WIDTH, HEIGHT);
const ctx2 = c2.getContext("2d");
ctx2.fillStyle = "yellow";
ctx2.beginPath();
ctx2.arc(WIDTH / 2, HEIGHT / 2, HEIGHT / 4, 0, 2 * Math.PI);
ctx2.fill();
ctx2.globalCompositeOperation = "destination-out";
ctx2.beginPath();
ctx2.arc(WIDTH / 2 + 30, HEIGHT / 2 - 15, HEIGHT / 4, 0, 2 * Math.PI);
ctx2.fill();
ctx.drawImage(c2, 0, 0); // merging the canvas, not its context!
我正在尝试用 canvas 创建一个月亮形状。为此,我创建了两个圆圈:一个用我的颜色填充,另一个用 globalCompositionOperation: "destination-out"
.
const moonCanvas = createCanvas(WIDTH, HEIGHT);
const moonCtx = canvas.getContext("2d");
moonCtx.beginPath();
moonCtx.arc(WIDTH / 2, HEIGHT / 2, HEIGHT / 4, 0, 2 * Math.PI);
moonCtx.fill();
moonCtx.globalCompositeOperation = "destination-out";
moonCtx.beginPath();
moonCtx.arc(WIDTH / 2 + 30, HEIGHT / 2, HEIGHT / 4, 0, 2 * Math.PI);
moonCtx.fill();
这是一个 fiddle 的最小复制:https://jsfiddle.net/h2qbytzn/
现在的问题是此操作向 canvas 添加了“显式”透明度。每当我想将月亮添加到另一个 canvas 时,它也会包括透明部分,从而覆盖那里已经存在的部分 canvas。
有没有办法在忽略透明部分的情况下导入 canvas 内容?
现在对我有用的是创建第二个 canvas,在那里绘制我的对象并将它们合并到原始 canvas 中 drawImage
:
const c2 = createCanvas(WIDTH, HEIGHT);
const ctx2 = c2.getContext("2d");
ctx2.fillStyle = "yellow";
ctx2.beginPath();
ctx2.arc(WIDTH / 2, HEIGHT / 2, HEIGHT / 4, 0, 2 * Math.PI);
ctx2.fill();
ctx2.globalCompositeOperation = "destination-out";
ctx2.beginPath();
ctx2.arc(WIDTH / 2 + 30, HEIGHT / 2 - 15, HEIGHT / 4, 0, 2 * Math.PI);
ctx2.fill();
ctx.drawImage(c2, 0, 0); // merging the canvas, not its context!