javascript - 如何在 html5 2d Canvas 绘图中组合多个剪切区域

标签 javascript html5-canvas 2d clipping html2canvas

我想绘制一个具有多剪切区域的区域。

这是屏幕截图:

enter image description here

我写了一个绘图示例:http://jsfiddle.net/younyzhU/zR9hg/1/

总面积应该是四个绿色区域+中心白色矩形。

从基础教程中,我知道绘制剪切平面就像绘制其他东西一样。

  1. 创建剪切区域
  2. context.clip()

但是,创建一个剪切区域,我们有多个区域,如何组合,有什么建议吗? 谢谢。

下面是一些代码:

  ctx.save();   // save the context so we don't mess up others
    ctx.beginPath();
    ctx.fillStyle = "#ffffff";
    ctx.rect(this.x, this.y, this.w, this.h);
    ctx.fill();
    ctx.restore();  // restore context to what it was on entry
    ctx.fillStyle = "#00ff00";//Color for four surrounded area.
    ctx.save(); // save the context so we don't mess up others
    ctx.beginPath();
    r = Math.sqrt((this.h/2)*(this.h/2) + 16 *this.w * this.w);
    thea = Math.atan(this.h/this.w/8);
    ctx.arc(this.x + this.w*4, this.y + this.h/2, r , Math.PI - thea,  Math.PI+thea, false);
    ctx.closePath();
    ctx.fill();
    //ctx.clip();
    ctx.restore();  // restore context to what it was on entry

    ctx.save(); // save the context so we don't mess up others
    ctx.beginPath();
    r = Math.sqrt((this.h/2)*(this.h/2) + 16 *this.w * this.w);
    thea = Math.atan(this.h/this.w/8);
    ctx.arc(this.x- this.w*3, this.y + this.h/2, r , -thea,  thea, false);
    ctx.closePath();
    ctx.fill();
    //ctx.clip();
    ctx.restore();  // restore context to what it was on entry

    ctx.save(); // save the context so we don't mess up others
    ctx.beginPath();
    r = Math.sqrt((this.w/2)*(this.w/2) + 16 * this.h * this.h);
    thea = Math.atan(this.w/this.h/8);
    ctx.arc(this.x + this.w/2, this.y + 4 * this.h, r , Math.PI*3/2-thea,  Math.PI*3/2 + thea, false);
    ctx.closePath();
    ctx.fill();
    ctx.restore();  // restore context to what it was on entry
    ctx.save(); // save the context so we don't mess up others
    ctx.beginPath();

    r = Math.sqrt((this.w/2)*(this.w/2) + 16*this.h*this.h);
    thea = Math.atan(this.w/this.h/8);
    ctx.arc(this.x + this.w/2, this.y-3*this.h , r , Math.PI/2-thea,  Math.PI/2 + thea, false);
    ctx.closePath();
    ctx.fill();
    ctx.restore();  // restore context to what it was on entry
    ctx.save();

最佳答案

剪切路径实际上是一条路径。

这意味着,如果您在一条路径中绘制所有 4 个闭合圆弧,则可以使用该多形状路径进行剪辑。

您可以通过在弧之前执行 1 个 beginPath 命令(而不是在每个弧之前执行 beginPath)来组合路径。

结果是一个如下所示的单个路径,您可以将其用作剪切路径:

enter image description here

例如,这就是如何使用剪切路径来包含对 Angular 条纹图像:

enter image description here

这里是示例代码和演示:http://jsfiddle.net/m1erickson/LYR3E/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    canvas{border:1px solid red;}
</style>
<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");

    var img=new Image();
    img.onload=start;
    img.src="https://dl.dropboxusercontent.com/u/139992952/multple/rainbowDiagonal.jpg";
    function start(){

        ctx.beginPath();
        ctx.fillStyle = "#000";
        ctx.rect(0,0,canvas.width,canvas.height);
        ctx.fill();

        draw();
    }

    function draw(){
        var x=50;
        var y=50;
        var w=200;
        var h=200;

        ctx.save();

        ctx.fillStyle = "#00ff00";//Color for four surrounded area.

        ctx.beginPath();

        r = Math.sqrt((h/2)*(h/2) + 16 *w * w);
        thea = Math.atan(h/w/8);
        ctx.arc(x + w*4, y + h/2, r , Math.PI - thea,  Math.PI+thea, false);
        ctx.closePath();

        r = Math.sqrt((h/2)*(h/2) + 16 *w * w);
        thea = Math.atan(h/w/8);
        ctx.arc(x- w*3, y + h/2, r , -thea,  thea, false);
        ctx.closePath();

        r = Math.sqrt((w/2)*(w/2) + 16 * h * h);
        thea = Math.atan(w/h/8);
        ctx.arc(x + w/2, y + 4 * h, r , Math.PI*3/2-thea,  Math.PI*3/2 + thea, false);
        ctx.closePath();

        r = Math.sqrt((w/2)*(w/2) + 16*h*h);
        thea = Math.atan(w/h/8);
        ctx.arc(x + w/2, y-3*h , r , Math.PI/2-thea,  Math.PI/2 + thea, false);
        ctx.closePath();

        ctx.clip();

        ctx.drawImage(img,0,0);

        ctx.restore();

    }

}); // end $(function(){});
</script>
</head>
<body>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

关于javascript - 如何在 html5 2d Canvas 绘图中组合多个剪切区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588146/

相关文章:

Java 尝试在 2D 中进行光线转换

c# - JavaScript中的条件语句

javascript - 更改十六进制的不透明度不起作用 - 热图停止梯度 -

javascript - D3.js 堆栈布局过渡和对齐 |用 fiddle (重做)

graphics - 如何生成等高线图?

c# - 使用 viewmatrix 移动二维对象

javascript - 如何获取网页上可见 DOM 元素的视觉大小

javascript - 仅特定文件路径的浏览器加载错误 - 内部服务器错误 500

php - 使用 javascript 到 php 的表单验证

javascript - 如何使用 DOMMatrix 设置 Canvas 图案的旋转原点?