html - 如何将图像像素转换为 Canvas 中的S曲线形状

标签 html canvas html5-canvas bezier

我有这样类型的图像fabric-pattern

我希望我们在图像中看到的直线(实际上是像素)应该转换成 S 曲线。我已经使用canvas及其属性实现了C型曲线,但无法实现S型曲线。

请帮助我。

最佳答案

如果我理解正确的话,你希望每条垂直线都遵循“S”吗?

如果是这种情况,您可以使用 f.ex。 Math.sin()drawImage() 及其裁剪参数相结合,对每个像素列的图像进行切片,同时根据 sin() 移动切片。

关键公式是:

var step = Math.PI * 2 / w;

这会将一个完整的圆映射到 Canvas 的宽度,这样当到达终点时我们将回到起点,在本例中形成一条 S 曲线。

var y = Math.sin(step * x) * scale;

这将根据先前计算的步长值计算 y 轴上的位移,现在链接到 x 位置。这会产生一个介于 -1 和 1 之间的值,因此我们需要将其放大。比例表示最大半径(以像素数为单位)。

示例

snapshot

var ctx = c.getContext("2d");           // just some inits for demo
var img = new Image;
img.onload = slice;
img.src = "//i.stack.imgur.com/UvqUP.gif";

function slice() {
  var w = c.width = this.width;
  var h = c.height = this.height;
  var step = Math.PI * 2 / w;           // full circle / width of canvas
  var scale = 75;                       // max displacement on y
  
  for(var x = 0; x < w; x++) {
    ctx.drawImage(this,
      x, 0, 1, h,                       // source line from image
      x, Math.sin(step*x)*scale, 1, h); // displaced line
  }
}
<canvas id=c></canvas>

在 x 轴上(在这种情况下显然不那么明显,因为变化是沿着线条发生的,并且可以使用其他方法,例如在两端绘制 S 形):

var ctx = c.getContext("2d");           // just some inits for demo
var img = new Image;
img.onload = slice;
img.src = "//i.stack.imgur.com/UvqUP.gif";

function slice() {
  var w = c.width = this.width;
  var h = c.height = this.height;
  var step = Math.PI * 2 / h;           // full circle / width of canvas
  var scale = 75;                       // max displacement on y
  
  for(var y = 0; y < h; y++) {
    ctx.drawImage(this,
      0, y, w, 1,                       // source line from image
      Math.sin(step*y)*scale, y, w, 1); // displaced line
  }
}
<canvas id=c></canvas>

关于html - 如何将图像像素转换为 Canvas 中的S曲线形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42712312/

相关文章:

HTML:通过单个 radio 输入传递多个变量?

html - 通过从图像中心旋转并缩放来拉直 HTML5 Canvas 中的图像

javascript - 如何向 Canvas 元素添加蒙版和背景

javascript - 生成具有完整 rgb 空间的 Canvas 颜色选择器

javascript - 在 Canvas 上逐像素绘制文本

javascript - 如何使用 jQuery 更改 div 类标题

javascript - 引用谷歌地图中的特定位置

html - 媒体查询斗争

javascript - HTML Canvas 在不同浏览器中呈现的文本略有不同

javascript - 使用 requestAnimationFrame 控制 fps?