【问题标题】:Remove clipping region from html5 canvas从 html5 画布中删除剪辑区域
【发布时间】:2016-02-01 19:47:54
【问题描述】:

我正在开发一个绘图应用程序,我会放置一些模板(形状遮罩),以便用户可以在上面以遮罩格式绘制。我可以添加模板(剪辑区域),但我无法删除它。我想知道如何从画布上删除这个剪辑区域,只留下用户所做的绘制。这是我用来添加模板的代码(区域剪辑):

Obs:我想移除(活)它,只留下用户在其中绘制的画。

jsFiddle 链接:Link to app on Js Fiddle

document.getElementById("addstencil").addEventListener("click", addstencil_funcao);

function addstencil_funcao() {


// layer1/Path
  context.save();
  context.beginPath();
  context.moveTo(285.0, 279.0);
  context.lineTo(0.0, 279.0);
  context.lineTo(0.0, 0.0);
  context.lineTo(285.0, 0.0);
  context.lineTo(285.0, 279.0);
  context.globalAlpha=0.3; //Opacidade da empresa
  context.closePath();
  context.fill();

  // layer1/Path
  context.beginPath();
  context.moveTo(211.4, 242.2);
  context.lineTo(144.0, 206.8);
  context.lineTo(76.6, 242.2);
  context.lineTo(89.5, 167.2);
  context.lineTo(35.0, 114.0);
  context.lineTo(110.3, 103.1);
  context.lineTo(144.0, 34.8);
  context.lineTo(177.7, 103.1);
  context.lineTo(253.0, 114.0);
  context.lineTo(198.5, 167.2);
  context.lineTo(211.4, 242.2);
  context.closePath();
  context.fillStyle = "transparent";
  context.fill();
  context.restore();
  context.clip();



var canvasPic = new Image();
canvasPic.src = imagem_source;
context.drawImage(canvasPic, 0, 0);
}

【问题讨论】:

  • 仅将.clip 包裹在.save.restore 中会清除剪辑区域(或者调整画布大小也会清除剪辑)。所以正确的顺序是:.save、.beginPath、很多路径命令(没有笔触/填充)、.clip、笔触/填充、.restore。顺便说一句, fillStyle='transparent' 不会清除像素——它只是让现有像素保持不变。干杯!
  • 伙计,谢谢!它起作用了,删除了剪切区域(蒙版),但我无法删除剪切区域的填充(不是星星的可绘制区域,黑色不透明部分),只留下我在里面完成的绘画。知道我该怎么做吗? “picasaweb.google.com/lh/photo/…”链接到应用程序绘图 Obs 的打印:这个想法是创建一个涂鸦模板。

标签: html canvas html5-canvas draw


【解决方案1】:

只有将 .clip 包裹在 .save 和 .restore 中才会清除剪辑区域(或调整画布大小也会清除剪辑)。所以正确的顺序是:.save、.beginPath、很多路径命令(没有笔触/填充)、.clip、笔触/填充、.restore。

顺便说一句,fillStyle='transparent' 不会清除像素——它只是保持现有像素不变。您可以通过设置globalCompositeOperation = 'destination-out' 并填充所需的擦除路径来“擦除”像素。这是一个例子:

var canvas=document.getElementById("canvas");
var context=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

// layer1/Path
context.beginPath();
context.moveTo(285.0, 279.0);
context.lineTo(0.0, 279.0);
context.lineTo(0.0, 0.0);
context.lineTo(285.0, 0.0);
context.lineTo(285.0, 279.0);
context.globalAlpha=0.3; //Opacidade da empresa
context.closePath();
context.fill();
context.globalAlpha=1.00;

// layer1/Path
context.beginPath();
context.moveTo(211.4, 242.2);
context.lineTo(144.0, 206.8);
context.lineTo(76.6, 242.2);
context.lineTo(89.5, 167.2);
context.lineTo(35.0, 114.0);
context.lineTo(110.3, 103.1);
context.lineTo(144.0, 34.8);
context.lineTo(177.7, 103.1);
context.lineTo(253.0, 114.0);
context.lineTo(198.5, 167.2);
context.lineTo(211.4, 242.2);
context.closePath();
context.globalCompositeOperation='destination-out';
context.fill();
context.globalCompositeOperation='source-over';
<canvas id="canvas" width=300 height=300></canvas>

【讨论】:

  • 伙计,谢谢!它起作用了,删除了剪切区域( mask )并将画布上下文恢复到原始状态,但我无法删除(擦除)剪切区域的填充(“星的不可绘制区域”,黑色不透明部分)和只留下我在里面完成的画。知道我该怎么做吗? Obs:这个想法是为绘图应用程序创建一个涂鸦模板。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2019-01-22
  • 2013-09-09
相关资源
最近更新 更多