<canvas>当前浏览器不支持canvas,请更换浏览器再试</canvas>
canvas 是一个二维网格。canvas 的左上角坐标为 (0,0)
canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成
canvas 标签中的内容只有当canvas画布无法显示时显示
var canvas = document.querySelector('canvas')
canvas.width = 1024
canvas.height = 768
canvas 标签的宽度和高度需在 js 代码中设置,css代码中设置的宽高仅仅只是拉伸 canvas 画布
var context = canvas.getContext('2d')
getContext(“2d”) 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。
在Canvas上画线,我们将使用下列方法:
context.moveTo(x, y) // 定义线条开始坐标
context.lineTo(x, y) // 定义线条结束坐标
context.fillStyle // 着色的样式(一般写颜色)
// color、gradient、image、canvas、video
context.strokeStyle // 线条样式(一般写颜色)
// fillStyle适用的样式都适用于strokeStyle
context.stroke() // 绘制
context.fill() // 着色
通过写多次lineTo可以绘制折线,或绘制多边形
context.beginPath() // 写了该条语句后,若不写moveTo语句, 默认第一条lineTo语句为moveTo
// 绘制一个路径
context.closePath() // 结束当前路径,若路径不是封闭路径,则将路径封闭
该两条语句成对出现可以绘制封闭图形,且不会存在瑕疵
context.closePath() 为可写方法,不添加则不封闭路径
context.lineWidth
属性值
context.lineCup
属性值
square 可以解决封闭路径的瑕疵问题,但一般用closePath()
lineCup 不能用于线段连接处
context.lineJoin
miter(默认值)
context.miterLimit
这个值默认为10: 当内角和外角的距离超过 10 时, 多余的长度不显示
(暂时这么理解,事实上 miterLimit 计算方式比较复杂)
bevel 斜边
像一条长纸条折叠后的效果(顶部平的)
round
参数
实际上我们在绘制圆形时使用了 “ink” 的方法, 比如 stroke() 或者 fill().
var c=document.getElementById('myCanvas');
var ctx=c.getContext('2d');
ctx.beginPath();
ctx.arc(95, 50, 40, 0, 2 * Math.PI);
ctx.stroke();
context.rect(x, y, width, height)
context.clearRect(startX, startY, width, height)
对矩形空间内的画布进行清空操作,有刷新的效果
context.fillRect(x, y, width, height)
也具有刷新画布的效果
context.strokeRect(x, y, width, height)
用stoke对绘制矩形的边框
translate(x, y)
将基坐标(0, 0)移动至(x, y)
多次使用translate(x, y)会有叠加效果,故需要在每次使用之后结尾添加 translate(-x, -y) 语句
或使用save(), restore()语句
scale(sx, sy)
在横向进行sx倍的缩放,在纵向进行sy倍的缩放
副作用:还会缩放基点(x,y)的坐标,lineWidth也会缩放
skew(sx, sy)
rotate(deg)
( a c e b d f 0 0 1 ) \begin{pmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{pmatrix} ⎝⎛ab0cd0ef1⎠⎞
a 水平缩放(1) c 垂直倾斜(0) e 水平位移(0)
b 水平倾斜(0) d 垂直缩放(1) f 垂直位移(0)
tansform(a, b, c, d, e, f) // 可以直接改变变换矩阵设置图形变换
setTransform(a, b, c, d, e, f) // 忽略之前设置的变换,以此次变换为准
save和restore一般成对出现,中间可以随意更改状态而不影响后续状态
设置渐变线
设置中间色彩
grd.addColorStop(start, color1) start开始为 0
grd.addColorStop(stop, color2) stop结束为 1
中间的色彩stop值可以改为(0,1)之间
填充渐变色
var c=document.getElementById('myCanvas');
var ctx=c.getContext('2d');
// Create gradient
var grd=ctx.createLinearGradient(0, 0, 200, 0);
grd.addColorStop(0, 'red');
grd.addColorStop(1, 'white');
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10, 10, 150, 80);
设置径向渐变圆
设置中间色彩
填充颜色
var c = document.getElementById('myCanvas');
var ctx = c.getContext('2d');
// Create gradient
var grd = ctx.createRadialGradient(75, 50, 5, 90, 60, 100);
grd.addColorStop(0, 'red');
grd.addColorStop(1, 'white');
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10, 10, 150, 80);
context.createPattern(img, repeat - style)
createPattern和css背景图片使用类似
var backgroundImg = new Image();
backgroundImg.src = '图片路径';
var pattern = context.createPattern(backgroundImg, 'no-repeat');
context.fillStyle = pattern;
context.createPattern(canvas, repeat-Style)
第一个参数除了图片还可以填写 画布 作为背景图片
context.createPattern(video, repeat-style)
还可以把 视频 当成背景
二次贝塞尔曲线
不同于arcTo, (x2, y2)就是二次贝塞尔曲线的终止点
三次贝塞尔曲线
三次曲线为两个控制点, 1 和 2
可以通过控制两个控制点的位置画出波浪线的效果,还可以绘制花瓣的效果
context.font // 可以设置5个值(最少需要font-size和font-family)
font-style
font-variant
font-weight
font-size
font-family
设置多种字体备选
支持@font-face
Web安全字体
context.font = 'bold 40px Arial'
context.fillText(string, x, y, [maxlen])
string是书写的字符串, (x, y)为位置
[maxlen]可选,为string的最大宽度,string太多,会被强制压缩
context.strokeText(string, x, y)
书写string, 文字有描边
context.textAlign
left为文字左边对齐于文字垂线(起始)
globalCompositeOperation
globalCompositeOperation属性值一览
source-over destination-over ligter
source-atop destination-atop copy
source-in destination-in xor
source-out destination-out
globalCompositeOperation属性值一览
source-over | destination-over | ligter |
---|---|---|
source-atop | destination-atop | copy |
source-in | destination-in | xor |
source-out | destination-out |
atop: 底下的图形会划定一个界限,覆盖在上面的图形超过底下图形的部分会不显示(底下的图形会显示)
in: 底下的图形会划定一个界限,覆盖在上面的图形超过底下图形的部分会不显示(底下的图形不会显示)
out: 底下的图形会划定一个界限,覆盖在上面的图形不会显示,超过底下图形的部分会显示(底下的图形不会显示)
ligter: 图形都会显示,但重叠部分的颜色会叠加
copy: 只显示最后一个图形
xor: 异或,重叠部分不显示
context.clip()
即 前一次绘制路径成为绘制环境
注意:若要实现动画效果,如果不用save,restore的话,接下来的绘制环境将仅在clip里面执行
CanvasRenderingContext2D
可将自己写的绘制函数添加到该对象的原型中
context.drawImage(image, dx, dy, dw, dh)
一般写在image图像加载完之后,即 image.onload 中
context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
离屏canvas
drawImage中可以传入canvas元素
imageData = context.getImageData(x, y, w, h)
含有三个属性值,width、height、data
var pixelData = imageData.data
第x行、第y列的像素
i = x * width + y
r —— pixelData[4 * i + 0]
g —— pixelData[4 * i + 1]
b —— pixelData[4 * i + 2]
a —— pixelData[4 * i + 3]
imageData最后位于(dx + dirtyX, dy + dirtyY)
var grey = r * 0.3 + g * 0.59 + b * 0.11 // 然后将灰度赋值给每r g b 即可实现灰度滤镜
将一个点的像素值连同周围的8个点,共9个点,计算平均值后赋值给该像素
(因为关联到其他的像素点,故需要保留一个修改前的模板图像作参考)
若想更模糊,可设定一个模糊半径R,同样计算半径R内的像素点平均值