我有将一堆图像加载到隐藏的img元素中的代码,然后将每个图像放置到 Canvas 上的Javascript循环。但是,我想剪切每个图像,以使其在 Canvas 上时是一个圆圈。
我的循环如下所示:
$$('#avatars img').each(function(avatar) {
var canvas = $('canvas');
var context = canvas.getContext('2d');
var x = Math.floor(Math.random() * canvas.width);
var y = Math.floor(Math.random() * canvas.height);
context.beginPath();
context.arc(x+24, y+24, 20, 0, Math.PI * 2, 1);
context.clip();
context.strokeStyle = "black";
context.drawImage(document.getElementById(avatar.id), x, y);
context.stroke();
});
问题是,仅绘制了第一张图像(或可见图像)。
如果删除裁剪逻辑:
$$('#avatars img').each(function(avatar) {
var canvas = $('canvas');
var context = canvas.getContext('2d');
var x = Math.floor(Math.random() * canvas.width);
var y = Math.floor(Math.random() * canvas.height);
context.drawImage(document.getElementById(avatar.id), x, y);
});
然后,我所有的图像都被绘制。
有没有一种方法可以分别裁剪每个图像?
我尝试将剪切区域重置为图像之间的整个 Canvas ,但这没有用。
最佳答案
您应该尝试保存当前上下文状态,然后将其还原:
canvas = document.getElementById("area");
context = canvas.getContext('2d');
$("#avatars img").each(function(avatar) {
var x = Math.floor(Math.random() * canvas.width);
var y = Math.floor(Math.random() * canvas.height);
context.save();//push current state into canvas
context.beginPath();
context.arc(x + 24, y + 24, 20, 0, Math.PI * 2, 1);
context.clip();
context.strokeStyle = "black";
//draw image this way
var img = new Image();
img.src = avatar.src;
img.onload = function() {
context.drawImage(img, x, y);
};
context.stroke();
context.restore();//restore context to the state
});
我认为,当调用drawImage方法时,还需要通过添加 avatar.src参数中的源代码行将image参数设置为Image类。
您应该检查引用文件中的Canvas State