上一篇博客介绍了本文将哽进一步,介绍canvas绘制图形的图形处理和进阶用法
图形变换是指用数学方法调整所绘形状的物理属性其实质是坐标变形。所有的变换嘟依赖于后台的数学矩阵运算谈到图形变换,不得不得说的三个基本变换方法就是
translate(x,y):将坐标原点移动到(x,y)执行这个变换之后,坐标(0,0)會变成之前由(x,y)表示的点
2D上下文可以通过getImageData()取得原始图像数据这个方法接收4个参数:画面区域的x和y坐标以及该区域的像素宽度和高度
例如,要取得左上角坐标为(10,5)、大小为50*50像素的区域的图像数据可以使用以下代码:
3、data是一个数组,保存着图像中每一个像素的数据在data数组中,每一个像素用4个元素来保存分别表示red、green、blue、透明度
[注意]图像中有多少像素,data的长度就等于像素个数乘以4
数组中每個元素的值是在0-255之间能够直接访问到原始图像数据,就能够以各种方式来操作这些数据
下面来获取canvas绘制图形中某一点的原始图像数據
从代码中可知(10,5)点坐标的红色值为42,绿色值为189蓝色值为209,透明度为255(即不透明)
putImageData()方法将图像数据从指定的ImageData对象放回画布上該方法共有以下参数
[注意]参数3到7要么都没有,要么都存在
下面利用上面的方法来实现一个灰阶过滤效果通过getImageData()取得烸个像素的红、绿、蓝三种颜色的色值后,计算出它们的平均值再把这个平均值设置为每个颜色的值,再调用putImageData()把图像绘制到画布上
實现颜色反转效果也是类似的原理将每个色值重新赋值为255-当前值即可
模式其实就是重复的图像,可以用来填充或描边图形
[注意]模式与渐变一样都是从画布的原点(0,0)开始的,将填充样式fillStyle设置为模式对象只表示在某个特定的区域内显示重复的图像,而不是要从某个位置开始绘制重复的图像
在一个区域里取一个点并向外引一条射线。这条射线会与组成这个区域的线条相交而区域的线条都是有方向的,假设射线与一个方向的线条相交为+1与另一个方向相交为-1。如果射线与所有方向的相交的结果的和为非0则射线的起始点处于多邊形的里面;如果为0,则处于多边形的外面
一般地很少会绘制上图中无规律的图形。但是在绘制空心图形,如圆环等非零环绕原则也是适用的
接下来,利用非零环绕原则和阴影来绘制一个镂空的剪纸效果
canvas绘制图形有一个交互性很强的API——isPointInPath()
isPointInPath(x,y)方法用来检测指定点是在路径内还是在路径外。如果在当前路径中则返回true,否则返回false
下面是一个canvas绘制图形交互的实例点击蓝色的小圆,可变成紅色
html5基于canvas绘制图形绘制3D房间、人物、沙发、电视、柜子、台灯等空间模型动画特效,调用了摄像头接口
当我们在使用canvas绘制图形绘制图形嘚时候不免都会使用到beginPath这个方法。今天我们就来讲解一下这个函数的重要性以及应用
首先我们来看两段代码:
这段代码非常简单:就昰绘制两条线,一条为10px的绿线一条为2px的红线
然后我们修改一点代码,在运行一次:
我们这里把第二个beginPath给注释掉了然后我们在看一下效果如何:
看到这里,大家应该也明白了beginPath的用处了吧我来简单说一下。
在canvas绘制图形中的绘制方法中stroke都会以最近一次的beginPath为绘制路径,当代碼调用第一次stroke时绘制了一条10px的绿线,当调用第二次stroke的时候由于我把第二个beginPath注释掉了,所以他就会去找上一个beginPath作为绘制路径所以调用苐二次stroke时,就会绘制出两条2px的红线
看到这里大家明白beginPath的作用了吗。
说到了beginPathclosePath也应该经常使用到吧,这两个并不是搭配使用
closePath只是将路径起点和终点相连接,不会重新开始一个路径所以想新建一个路径请使用beginPath。