【问题标题】:HTML Canvas clip and putImageDataHTML Canvas 剪辑和 putImageData
【发布时间】:2011-07-13 06:19:00
【问题描述】:

我有一个画布,背景中有一个大图像,前面有一个较小的圆形图像。我通过像这样使用剪辑实现了这种圆形图像效果

ctx.save();

ctx.beginPath();
ctx.arc(x,y,r,0,Math.PI*2, true);   
ctx.closePath();
ctx.clip();

ctx.drawImage(img,x-r,y-r,2*r,2*r);     // draw the image
ctx.restore();

然后我想旋转圆形图像,所以我使用第二个上下文并像这样旋转和重绘

backCanvas=document.createElement('canvas');    
backContext=backCanvas.getContext('2d');
backCanvas.width=w;
backCanvas.height=h;

backContext.translate(w/2,h/2);
backContext.rotate(a);

backContext.drawImage(img,-w/2,-h/2,w,h);

var imgData=backContext.getImageData(0,0,w,h);

ctx.save();

ctx.beginPath();
ctx.arc(x,y,r,0,Math.PI*2, true);   
ctx.closePath();
ctx.clip();
ctx.putImageData(imgData,x,y);

ctx.restore();

但是发生的情况是黑色透明背景从背面画布复制而来,剪辑无法“剪辑”它。

任何帮助将不胜感激

【问题讨论】:

  • 仅供参考,如果您在画布上绘制的图像位于不同的域中,则不允许您调用 getImageData。
  • 是的,你完全正确。我不久前遇到了这个问题,并通过发出命令 解决了这个问题

标签: html canvas clip


【解决方案1】:

根据specs

当前路径、变换矩阵、阴影属性、全局 alpha、剪切区域和全局合成运算符不得影响 getImageData() 和 putImageData() 方法.

在您的情况下,您为什么要使用额外的画布和像素数据操作?为什么不只是

ctx.save();

ctx.beginPath();
ctx.arc(x, y, r, 0, Math.PI*2, true);   
ctx.closePath();
ctx.clip();

ctx.translate(x, y);
ctx.drawImage(img, -r, -r, 2*r, 2*r);
// not restoring context here, saving the clipping region and translation matrix

// ... here goes the second part, wherever it is:
ctx.save();
ctx.rotate(a);
ctx.drawImage(img, -r, -r, 2*r, 2*r);
ctx.restore();

【讨论】:

  • 抱歉,我对剪辑和转换的概念还很陌生。我试试看
  • 成功了!谢谢。但我必须在最后添加一个 ctx.restore() 才能使其工作
猜你喜欢
  • 2017-10-31
  • 2010-11-02
  • 1970-01-01
  • 2011-12-10
  • 2017-02-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多