【问题标题】:How correctly apply globalCompositeOperation on canvas's elements?如何在画布的元素上正确应用 globalCompositeOperation?
【发布时间】:2017-09-13 07:31:16
【问题描述】:

我对 globalCompositeOperation 有疑问。

我的目标是使蓝色元素仅显示在红色元素内部,并且根本不应该在红色矩形之外可见(一种溢出隐藏效果)。另外,红色和蓝色都必须具有变形能力(均可编辑)。

如您所见,如果我在画布中再添加一个元素(黄色元素),蓝色元素会在黄色和蓝色重叠的区域可见。

http://jsfiddle.net/redlive/q4bvu0tb/1/

var canvas = new fabric.Canvas('c');


var yellow = new fabric.Circle({
  top: 200,
  left: 0,
  radius: 100,
  strokeDashArray: [5, 5],
  stroke: 'black',
  strokeWidth: 5,
  fill: 'yellow'
});
canvas.add(yellow);


var red = new fabric.Rect({
  top: 0,
  left: 0,
  width: 300,
  height: 300,
  strokeDashArray: [5, 5],
  stroke: 'black',
  strokeWidth: 5,
  fill: 'red',
  rx: 40
});
canvas.add(red);


var blue = new fabric.Circle({
  top: 150,
  left: 80,
  radius: 100,
  strokeDashArray: [5, 5],
  stroke: 'black',
  strokeWidth: 5,
  fill: 'blue',
    globalCompositeOperation: 'source-atop'
});
canvas.add(blue);



var green = new fabric.Circle({
  top: 0,
  left: 0,
  radius: 100,
  strokeDashArray: [5, 5],
  stroke: 'black',
  strokeWidth: 5,
  fill: 'green'
});
canvas.add(green);

强制性条件:

  • 保留 Canvas 上的元素外观。
  • 没有剪辑(因为剪辑 不允许同时添加背景颜色和图片)

【问题讨论】:

    标签: javascript canvas fabricjs globalcompositeoperation


    【解决方案1】:

    使用以下步骤可以完成...

    • 在绘制blue 之前删除yellow 元素
    • 绘制blue 元素后,将yellow 元素的globalCompositeOperation 设置为destination-over 并添加回来

    var canvas = new fabric.Canvas('c');
    
    var yellow = new fabric.Circle({
      top: 200,
      left: 0,
      radius: 100,
      strokeDashArray: [5, 5],
      stroke: 'black',
      strokeWidth: 5,
      fill: 'yellow'
    });
    canvas.add(yellow);
    
    var red = new fabric.Rect({
      top: 0,
      left: 0,
      width: 300,
      height: 300,
      strokeDashArray: [5, 5],
      stroke: 'black',
      strokeWidth: 5,
      fill: 'red',
      rx: 40
    });
    canvas.add(red);
    
    canvas.remove(yellow); //remove yellow
    
    var blue = new fabric.Circle({
      top: 150,
      left: 80,
      radius: 100,
      strokeDashArray: [5, 5],
      stroke: 'black',
      strokeWidth: 5,
      fill: 'blue',
      globalCompositeOperation: 'source-atop'
    });
    canvas.add(blue);
    
    yellow.set({globalCompositeOperation: 'destination-over'}); //set gCO for yellow
    canvas.add(yellow); //add yellow back
    
    var green = new fabric.Circle({
      top: 0,
      left: 0,
      radius: 100,
      strokeDashArray: [5, 5],
      stroke: 'black',
      strokeWidth: 5,
      fill: 'green'
    });
    canvas.add(green);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
    <canvas id="c" width="800" height="800"></canvas>

    【讨论】:

    • 感谢您的评论...这样,我知道...问题是元素动态加载到画布上,我需要保留它们的外观(z-index)。黄色必须在红色区域之后。
    • 非常好...可能是一个潜在的解决方案,但是,这种使用删除和添加元素的操作会破坏动态元素的渲染条件,因此不会保留它们的顺序...
    • 嗯.. 在玩过“动态”渲染之后,我意识到移除元素并将它们带回来并不是一个好主意,因为你永远不知道什么是即将到来的元素以及需要什么元素被删除然后带回来......无论如何......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2021-03-03
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多