5

我有将一堆图像加载到隐藏的 img 元素中的代码,然后是一个 Javascript 循环,它将每个图像放置到画布上。但是,我想剪辑每个图像,使其放置在画布上时是一个圆圈。

我的循环如下所示:

    $$('#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);
    });

然后我所有的图像都被绘制出来了。

有没有办法单独剪辑每个图像?

我尝试将剪切区域重置为图像之间的整个画布,但这没有用。

4

1 回答 1

10

您应该尝试保存当前上下文状态,然后恢复它:

        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 类。

您应该查看Canvas State的参考文档

于 2010-03-31T11:19:30.953 回答