这里有一种可能性,使用destination-out
在临时画布中一次切出一块,然后将它们组合在"主"画布中,这是最后的一个小代码.
我要用的图片是一朵向日葵
我认为这将是一个很好的开始,因为所有奇怪的形状边缘
var s = 10 // thickness scale
var img = new Image;
img.onload = draw;
img.src = "https://i.imgur.com/eKKoWVT.png"
var canvas = document.getElementById('c')
var t_canvas = document.createElement('canvas');
t_canvas.width = canvas.width
t_canvas.height = canvas.height
var ctx = canvas.getContext('2d')
var t_ctx = t_canvas.getContext('2d')
function draw() {
for (i = 0; i < 8; i += Math.PI / 64) {
t_ctx.globalCompositeOperation = "source-over";
t_ctx.drawImage(img, 0, 0, 400, 400);
t_ctx.globalCompositeOperation = "destination-out";
t_ctx.drawImage(img, Math.sin(i) * s, Math.cos(i) * s, 400, 400);
ctx.drawImage(t_canvas, 0, 0, 400, 400);
}
}
<canvas id="c" width=400 height=400></canvas>
下面是一个"慢动作"过程,展示了如何从大图中提取内联绘图
var s = 50 // thickness scale
var i = 0
var img = new Image;
img.onload = draw
img.src = "https://i.imgur.com/eKKoWVT.png"
var canvas = document.getElementById('c')
var t_canvas = document.createElement('canvas');
t_canvas.width = canvas.width
t_canvas.height = canvas.height
var ctx = canvas.getContext('2d')
var t_ctx = t_canvas.getContext('2d')
function draw() {
t_ctx.globalCompositeOperation = "source-over";
t_ctx.drawImage(img, 0, 0, 400, 400);
t_ctx.globalCompositeOperation = "destination-out";
t_ctx.drawImage(img, Math.sin(i) * s, Math.cos(i) * s, 400, 400);
ctx.globalCompositeOperation = "xor";
ctx.drawImage(t_canvas, 0, 0, 400, 400);
ctx.moveTo(200 + Math.sin(i) * 9, 200 + Math.cos(i) * 9)
ctx.lineTo(200 + Math.sin(i) * s, 200 + Math.cos(i) * s)
ctx.stroke()
i += Math.PI / 64
if (i < 8)
setTimeout(draw, 100);
}
<canvas id="c" width=400 height=400></canvas>