HTML5 画布,多边形上/内的图像可能吗?

问题描述 投票:0回答:3

有没有办法使用 javascript html5 canvas 来创建一个多边形,然后在其中显示图像而不是颜色?

javascript html canvas html5-canvas
3个回答
5
投票

经过一些研究,我相信可以通过首先使用您的图像创建一个图案,然后将该图案设置为

fillStyle
:

来做到这一点
var ctx = canvas.getContext("2d");
var pattern = ctx.createPattern(imageObj, "repeat");
ctx.fillStyle = pattern;

然后只需创建多边形(使用

moveTo
lineTo
),然后正常填充即可。

来源:这个插件的源代码。免责声明:我自己还没有尝试过确认是否有效。

更新:我仍在研究是否可以操纵图像以适应任意多边形。原则上,您可以使用

setTransform
来做到这一点:

ctx.save();
ctx.setTransform(m11, m12, m21, m22, dx, dy);
ctx.drawImage(imageObj);
ctx.restore();

确定

setTransform
参数的值(如果可以的话)是棘手的部分。自从我做任何数学以来已经很长时间了,但如果我没记错的话,这里就是需要做的事情:

(0,0) --- (w,0)       (x1,y1) --- (x2,y2)
  |         |            |           |
  |  Image  |     =>     |  Morphed  |
  |         |            |           |
(0,h) --- (w,h)       (x3,y3) --- (x4,y4)

对于每个点,您需要执行以下矩阵运算:

|m11 m21 dx|   |xI|   |xM|
|m12 m22 dy| X |yI| = |yM|
| 0   0   1|   | 1|   | 1|

八个方程,六个变量(记住矩阵元素是变量,其余的是常数 - 我们的输入)。可能无解。现在只需推导(或谷歌搜索,或在 Math.SE 中询问...)并实现每个参数的公式...

更新2:虽然我没有确凿的证据,但我相信用

setTransform
做你想做的事是不可能的。看看 Gimp 如何使用其“透视”工具,还需要更改变换矩阵的第三行以将图像变换为任意多边形。 Canvas API 似乎没有提供相应的方法(通常只支持仿射变换:平移、旋转、缩放、剪切或上述的组合)。

引用 this post 关于 2D 变换:

CSS3 2D-Transforms 只能将块转换为平行四边形。例如,不可能将块转换成以下形状: [不规则形状] 为此,必须使用 CSS3 3D 变换。这就是为什么矩阵构造集只有三个控制点可供拖动,而不是四个。

CSS 3D Transforms 的计划,但我不仅不知道它的支持范围有多大,我也不知道 canvas 元素(带有 2d 上下文,即 - WebGL 是另一个故事)是否会支持它。简而言之,通过我所知道的任何手段都不可能做你想做的事。


4
投票

您可以使用

context.clip()
用图像填充多边形:

  //create an image
  var img = new Image();
  img.src = 'imgPath/image.png'

  //draw the image when loaded
  img.onload = function(){
      var ctx = canvas.getContext("2d");
      ctx.save();

      //define the polygon
      ctx.beginPath();
      ctx.moveTo(x1,y1);
      ctx.lineTo(x2,y2);
      ctx.lineTo(x3,y3);
      ctx.closePath();

      //draw the image
      ctx.clip();
      ctx.drawImage(img, leftMostXCoor, highestYCoor, polyWidth, polyHeight);

      //fill and stroke are still available for overlays and borders
      ctx.fill();
      ctx.stroke();

      ctx.restore();
  }

0
投票

如果你只想要规则的多边形,那么你可以使用这个纯CSS工具而不是画布(免责声明,我写的)https://html-polygon.com

虽然它仅针对 React 和 Vue 构建,但您可以使用该网站上的播放工具并获取生成的 HTML。

© www.soinside.com 2019 - 2024. All rights reserved.