经过一些研究,我相信可以通过首先使用您的图像创建一个图案,然后将该图案设置为fillStyle:
var ctx = canvas.getContext("2d");
var pattern = ctx.createPattern(imageObj, "repeat");
ctx.fillStyle = pattern;
然后只需创建多边形(使用moveTo 和lineTo)然后正常填充它。
来源:this plugin 的源代码。免责声明:我自己没有尝试过确认它有效。
更新:我仍在调查您是否可以操纵图像以适应任意多边形。原则上,您可以使用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 似乎没有为此提供方法(通常只支持仿射变换:平移、旋转、缩放、剪切或以上的组合)。
在 2D 变换中引用 this post:
CSS3 2D-Transforms 只能将块转换为平行四边形。例如,不可能将块转换成这种形状:
[不规则形状]
为了做到这一点,必须使用 CSS3 3D 变换。这就是为什么矩阵构造集只有三个控制点可以拖动,而不是四个。
有CSS 3D Transforms 的计划,但不仅我不知道它的支持范围有多广,我不知道画布元素(具有 2d 上下文,即 WebGL 是另一个故事)是否会支持它。简而言之,通过我所知道的任何方式,都不可能为所欲为。