龙空技术网

JavaScript全解析——canvas 绘制图片

陆荣涛 252

前言:

当前大家对“js是否是图片”大概比较注意,各位老铁们都需要剖析一些“js是否是图片”的相关文章。那么小编也在网上收集了一些关于“js是否是图片””的相关文章,希望各位老铁们能喜欢,你们一起来学习一下吧!

●在 canvas 内也是可以直接插入一个图片的

●如果在 canvas 内想插入一个图片

○首先要用 js 加载一个图片

○当图片加载完毕以后, 我们在用 canvas 的 API 把它插入到画布上即可

●先用 js 加载一张图片出来

const myImg = new Image()myImg.sec = './01小锋.png'// 准备一个加载完毕的事件myImg.onload = function () {    console.log(this) // 这里的 this 就是这个图片的内容}

○这样我们就得到了一个图片内容

○这个可是 JS 的语法哦, 和 canvas 没有关系

●接下来就可以使用 canvas 的 API 把这个加载好的图片插入到画布上了

●语法 : 工具箱.drawImage( 图片内容, 起点 x 坐标, 起点 y 坐标, 宽度, 高度 )

// 0. 获取到页面上的 canvas 标签元素节点const canvasEle = document.querySelector('#canvas')// 1. 获取当前这个画布的工具箱const ctx = canvasEle.getContext('2d')// 2. 加载图片myImg.sec = './01小锋.png'// 准备一个加载完毕的事件myImg.onload = function () {    console.log(this) // 这里的 this 就是这个图片的内容    // 3. 插入到画布内    ctx.drawImage( this, 100, 100, 236, 368 )}

●这是, 图片就插入到页面上了

●注意 : 如果你设置的 宽度 和 高度 于图片尺寸不符, 会按照你预设尺寸缩放图片

绘制贝塞尔曲线

●canvas 中绘制贝塞尔曲线是一个既复杂又简单的工作

●首先, 我们要知道什么是贝塞尔曲线

了解贝塞尔曲线

●概念 :

贝塞尔曲线(Bezier curve)是计算机图形学中相当重要的参数曲线,它通过一个方程来描述一条曲线,根据方程的最高阶数,又分为线性贝赛尔曲线,二次贝塞尔曲线、三次贝塞尔曲线和更高阶的贝塞尔曲线。

贝塞尔曲线需要提供几个点的参数,首先是 曲线的起点和终点

如果控制点数量为 0,我们称之为线性贝塞尔;

控制点数量为 1,则为二阶贝塞尔曲线;

控制点数量为 2,则为三阶贝塞尔曲线,依此类推。

●我们比较常用到的就是 二阶 和 三阶, 其他的比较少

●更复杂一些的贝塞尔曲线, 我们就需要借助工具来进行测算了

●先来看二阶贝塞尔曲线

○其实就是由 三个点 绘制成两个直线

○然后我们会同时从每条直线的起点开始,向终点移动按比例拿到一个点。然后将这些点再连接,产生 n - 1 条直线。

○就这样,我们继续同样的操作的,直到变成一条直线,然后我们按比例取到一个点,这个点就是曲线经过的点。

○当我们比例一点点变大(从 0 到 1),就拿到了曲线中间的所有点,最终绘制出完整的曲线。

GIF

●再来看看三阶贝塞尔曲线

○和二阶贝塞尔曲线是一个道理, 只不过控制点数量变成了两个

GIF

●这个东西看起来好难

●但是其实绘制的时候不需要我们来逐个点的计算, canvas 给我们提供了对应的 API

绘制二阶贝塞尔曲线

●我们先用 canvas 的内的线段来描述一个二阶贝塞尔曲线的形状

// 0. 获取到页面上的 canvas 标签元素节点const canvasEle = document.querySelector('#canvas')// 1. 获取当前这个画布的工具箱const ctx = canvasEle.getContext('2d')// 2. 描绘测定贝塞尔曲线的线段形状ctx.moveTo(20, 170)ctx.lineTo(130, 40)ctx.lineTo(180, 150)ctx.stroke()

●这就是我们预设的三个点位描绘出来的一个夹角

●接下来我们在这个基础上绘制贝塞尔曲线

// 0. 获取到页面上的 canvas 标签元素节点const canvasEle = document.querySelector('#canvas')// 1. 获取当前这个画布的工具箱const ctx = canvasEle.getContext('2d')// 2. 描绘测定贝塞尔曲线的线段形状ctx.moveTo(20, 170)ctx.lineTo(130, 40)ctx.lineTo(180, 150)ctx.stroke()// 3. 绘制二阶贝塞尔期限ctx.beginPath()ctx.moveTo(20, 170) // 起点, 描绘 p0 点位// 语法 : ctx.quadraticCurveTo(p1 x坐标, p1 y坐标, p2 x坐标, p2 y坐标)ctx.quadraticCurveTo(130, 40, 180, 150)ctx.strokeStyle = 'red'ctx.stroke()

●这条红色的曲线, 就是一个二阶贝塞尔曲线

●这个时候把我们预设的用来观察的线段取消掉就好了

// 0. 获取到页面上的 canvas 标签元素节点const canvasEle = document.querySelector('#canvas')// 1. 获取当前这个画布的工具箱const ctx = canvasEle.getContext('2d')// 2. 绘制二阶贝塞尔期限ctx.beginPath()ctx.moveTo(20, 170) // 起点, 描绘 p0 点位// 语法 : ctx.quadraticCurveTo(p1 x坐标, p1 y坐标, p2 x坐标, p2 y坐标)ctx.quadraticCurveTo(130, 40, 180, 150)ctx.strokeStyle = 'red'ctx.stroke()

绘制三阶贝塞尔曲线

●其实和二阶贝塞尔曲线一样, 只不过是我们描述的点位变多了一个而已

●和刚才一样, 我们还是先来描述一个预设线段, 用于观察

// 0. 获取到页面上的 canvas 标签元素节点const canvasEle = document.querySelector('#canvas')// 1. 获取当前这个画布的工具箱const ctx = canvasEle.getContext('2d')// 2. 描绘测定贝塞尔曲线的线段形状ctx.moveTo(25, 175)ctx.lineTo(60, 80)ctx.lineTo(150, 30)ctx.lineTo(170, 150)ctx.stroke()

●接下来按照我们预设好的点位开始绘制三阶贝塞尔曲线

// 0. 获取到页面上的 canvas 标签元素节点const canvasEle = document.querySelector('#canvas')// 1. 获取当前这个画布的工具箱const ctx = canvasEle.getContext('2d')// 2. 描绘测定贝塞尔曲线的线段形状ctx.moveTo(25, 175)ctx.lineTo(60, 80)ctx.lineTo(150, 30)ctx.lineTo(170, 150)ctx.stroke()// 3. 根据上述描述路径绘制三阶贝塞尔曲线ctx.beginPath()ctx.moveTo(25, 175) // 起点, 描述 p0 点位// 语法 : ctx.bezierCurveTo(p1 x, p1 y, p2 x, p2 y, p3 x, p3 y)ctx.bezierCurveTo(60, 80, 150, 30, 170, 150)ctx.strokeStyle = 'red'ctx.stroke()

●这时一个三阶贝塞尔曲线就出现了

●是不是还挺简单的

标签: #js是否是图片 #js获取第一张图片