javascript - 带有 HTML5 Canvas 的 putImageData 的掩码?

标签 javascript image-processing canvas

我想从现有图像中截取不规则形状的部分,并使用 HTML5 Canvas 在 Javascript 中将其渲染为新图像。因此,只会复制多边形边界内的数据。我提出的方法涉及:

  1. 在新 Canvas 中绘制多边形。
  2. 使用 clip 创建 mask
  3. 使用getImageData(矩形)从原始 Canvas 复制数据
  4. 使用 putImageData 将数据应用到新 Canvas

它没有用,整个矩形(例如来自边界外源的东西)仍然出现。 This question解释原因: “规范说 putImageData 不会受到裁剪区域的影响。”该死!

我还尝试绘制形状,设置 context.globalCompositeOperation = "source-in",然后使用 putImageData。同样的结果:没有应用蒙版。我怀疑出于类似的原因。

关于如何实现这个目标有什么建议吗?这是我正在进行的工作的基本代码,以防我不清楚我要做什么。 (不要太努力地调试它,它是从使用大量不在此处的函数的代码中清理/提取的,只是试图显示逻辑)。

 // coords is the polygon data for the area I want
   context = $('canvas')[0].getContext("2d");
   context.save();
   context.beginPath();
   context.moveTo(coords[0], coords[1]);
   for (i = 2; i < coords.length; i += 2) {
     context.lineTo(coords[i], coords[i + 1]);
   }
   //context.closePath();
   context.clip();

   $img = $('#main_image');
   copy_canvas = new_canvas($img); // just creates a new canvas matching dimensions of image
   copy_ctx = copy.getContext("2d");

   tempImage = new Image();
   tempImage.src = $img.attr("src");
   copy_ctx.drawImage(tempImage,0,0,tempImage.width,tempImage.height);

  // returns array x,y,x,y with t/l and b/r corners for a polygon
  corners = get_corners(coords)
  var data = copy_ctx.getImageData(corners[0],corners[1],corners[2],corners[3]);
  //context.globalCompositeOperation = "source-in";
  context.putImageData(data,0,0);
  context.restore();

最佳答案

不要使用putImageData,

只需使用 document.createElement 创建一个额外的内存 Canvas 来创建 mask 并使用 drawImage()globalCompositeOperation 应用它功能(根据您需要选择正确模式的顺序;

我愿意something similar here code is here (注意 CasparKleijne.Canvas.GFX.Composite 函数)

关于javascript - 带有 HTML5 Canvas 的 putImageData 的掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942141/

相关文章:

javascript - 如何从点击事件中调用类函数

python - 如何测量标记分割图像的平均厚度

javascript - html5 canvas删除垂直/水平线像素值

javascript - 在 Canvas 上找到最理想的位置来书写文字

javascript - Fabric .js : reset controls axis of group after rotation

javascript - IE9双表单提交问题

java - 我可以使用 ScriptableObject 在 Java 中构建 Rhino JavaAdapter 吗?

javascript - 我正在尝试将图像从数组添加到我的 flickity 轮播中并使用 for 循环

php - PHP 中的动态图像生成

python - 如何将RGB图像像素转换为L*a*b*?