Javascript 使用样条线剪裁图像?

Javascript 使用样条线剪裁图像?,javascript,kineticjs,spline,Javascript,Kineticjs,Spline,我在画布元素中有一张用户脸的图像。我希望他们能够画出它周围,以减少它。我已经成功地使用了一个拼接来围绕他们的脸绘制一条平滑的曲线(拼接点阵列随着每次鼠标点击而增加一个,越来越长) 但我不确定如何实际使用此样条线来剪裁图像。我可以使用mySpline.allPoints数组访问点数组,然后绘制自己的剪裁路径,但这会生成一个非常线性的形状,没有所有漂亮的样条曲线计算曲线 有人有解决方案吗?这可能不是最好的答案,但下面是绘制样条线的代码: drawFunc: function(canvas)

我在画布元素中有一张用户脸的图像。我希望他们能够画出它周围,以减少它。我已经成功地使用了一个拼接来围绕他们的脸绘制一条平滑的曲线(拼接点阵列随着每次鼠标点击而增加一个,越来越长)

但我不确定如何实际使用此样条线来剪裁图像。我可以使用mySpline.allPoints数组访问点数组,然后绘制自己的剪裁路径,但这会生成一个非常线性的形状,没有所有漂亮的样条曲线计算曲线


有人有解决方案吗?

这可能不是最好的答案,但下面是绘制样条线的代码:

     drawFunc: function(canvas) {
        var points = this.getPoints(), length = points.length, context = canvas.getContext(), tension = this.getTension();
        context.beginPath();
        context.moveTo(points[0].x, points[0].y);

        // tension
        if(tension !== 0 && length > 2) {
            var ap = this.allPoints, len = ap.length;
            context.quadraticCurveTo(ap[0].x, ap[0].y, ap[1].x, ap[1].y);

            var n = 2;
            while(n < len - 1) {
                context.bezierCurveTo(ap[n].x, ap[n++].y, ap[n].x, ap[n++].y, ap[n].x, ap[n++].y);
            }

            context.quadraticCurveTo(ap[len - 1].x, ap[len - 1].y, points[length - 1].x, points[length - 1].y);

        }
        // no tension
        else {
            for(var n = 1; n < length; n++) {
                var point = points[n];
                context.lineTo(point.x, point.y);
            }
        }

        canvas.stroke(this);
    },
drawFunc:函数(画布){
var points=this.getPoints(),length=points.length,context=canvas.getContext(),tension=this.getTension();
context.beginPath();
context.moveTo(点[0].x,点[0].y);
//紧张
如果(张力!==0&&length>2){
var ap=this.allPoints,len=ap.length;
context.quadraticCurveTo(ap[0].x,ap[0].y,ap[1].x,ap[1].y);
var n=2;
而(n

它使用二次曲线和bezier曲线来绘制曲线,给定曲线的点。

因此,本质上,您需要将剪裁路径设置为所有点之间的bezier/二次曲线。如果剪切路径不允许曲线,则必须计算曲线上的中间点,并将这些点作为剪切路径的一部分。谢谢EliteOctagon。这是我自己想出的最好的解决办法。在进行实际剪裁时,我只需抓取样条曲线(及其所有点——它似乎以某种方式生成了一些“中间”点,这是需要的)。然后,我只需使用上面的代码再次手动绘制一条剪切路径。很遗憾,因为我正在复制代码,但它是有效的:)有没有可能在JSFIDLE中显示一些代码?我很想看到裁剪曲线的功能在发挥作用。一些重复的代码不会有什么坏处,如果你的整个程序到处都是重复的话,那就不一样了。没问题。很难放入JSFIDLE,因此我已将正在进行的工作上载到我的域。-点击“开始”加载图像——点击“开始剪辑路径”并在面周围单击以绘制点——点击“完成剪辑路径”以完成。现在您可以拖动和编辑点--点击“剪辑”来剪辑图像