如何在html5canvas中弯曲/弯曲图像

我有这个 在此处输入图像描述

我想做这个

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

HTML

 

JS

 var temp_can1, temp_can1_ctx; $(document).ready(function () { temp_can1 = document.getElementById('mycanvas'); temp_can1_ctx = temp_can1.getContext('2d'); var imageObj_rotator3 = new Image(); imageObj_rotator3.onload = function () { temp_can1_ctx.drawImage(imageObj_rotator3, 0, 0); temp_can1_ctx.globalCompositeOperation = "source-atop"; var pattern = temp_can1_ctx.createPattern(imageObj_rotator3, 'no-repeat'); temp_can1_ctx.rect(0, 0, temp_can1.width, temp_can1.height); temp_can1_ctx.fillStyle = pattern; temp_can1_ctx.fill(); temp_can1_ctx.globalAlpha = 0.10; temp_can1_ctx.drawImage(imageObj_rotator3, 0, 0); temp_can1_ctx.drawImage(imageObj_rotator3, 0, 0); temp_can1_ctx.drawImage(imageObj_rotator3, 0, 0); }; imageObj_rotator3.src = 'http://i.stack.imgur.com/o8EJp.png'; }); 

这是我的JSFiddler 更新的JSFiddler

这是可以在html5canvas中做到的。 如果可能的话,请告诉我一些方向/例子。

谢谢

由于拉伸输出需要非仿射变换,因此无法使用任何本机Canvas变换。 即仅通过组合旋转,平移等无法实现。

理想情况下,您需要定义一个公式映射到扭曲坐标系的原始笛卡尔坐标,然后迭代目标像素空间,使用上面的映射来确定该像素所需的颜色。

您还需要插入相邻像素以避免输出看起来“块状”。

这是非平凡的……

是的,这是可能的,但对您的项目来说似乎并不实用。

您可以使用透视切片技术:

http://www.subshel​​l.com/en/subshel​​l/blog/image-manipulation-html5-canvas102.html

你也可以“伪造”非仿射变换。 这通常涉及:

  1. 将图像分成矩形,
  2. 将这些矩形对角地分成三角形。
  3. 扭曲这些三角形以形成所需的失真 – 失真线框。
  4. 对于每个三角形:将原始图像从未失真的三角形像素插值到扭曲的三角形中以实现扭曲变形。

为此,您需要WebGL。 您必须拍摄想要扭曲的图像,将其用作纹理并将其映射到曲面上。