当前位置 博文首页 > m0_45291815的博客:Canvas基础
创建一个canvas的H5标签,并内敛指定宽高:
<canvas height="200" width="200"></canvas>
使用getElementById获取canvas元素,这样可以保证canvas的唯一性:
canvas = document.getElementById('canvas')
创建canvas画布操作对象:
ctx = canvas.getContext('2d');
兼容,低版本浏览器会将canvas识别为div标签:
<canvas>你的浏览器不支持 canvas,请升级你的浏览器。</canvas>
anvas转图片存储:
canvas.toBlob((blob) => {
此时的blob就是转换为图片文件后的二进制码,可以添加formData进行上传
}, 'image/png')
canvas转图片链接:
var dataURL = canvas.toDataURL('image/png');
// 示例
const back = document.getElementById('back')
back.style.background = 'url(' + dataURL + ') left top repeat';
两个重要属性:面填充 和 边填充
ctx.fillStyle = red
ctx.globalAlpha = 1
范围0-1ctx.fill()
定义描边颜色:ctx.strokeStyle = blue
定义描边宽度:ctx.lineWidth = 5
定义边的端点:ctx.lineCap = 'butt'
// butt: 默认值; round: 比定义线长两边各多半圆;square: 比定义线长两边各多矩形
定义边的连接点:ctx.lineJoin = 'butt'
// butt: 默认值:尖角;round: 圆角;miter: 平角
绘制虚线:ctx.setLineDash([10, 4])
; 绘制段长围10,间隔4的虚线
// 数组内每两元素为一组,变量通过ctx.getLineDash获取
绘制虚线偏移:ctx.lineDashOffset = 2
, 虚线偏移量
倾斜角偏移长度:ctx.miterLimit = number
绘制描边:ctx.stroke()
声明画路径:ctx.beginPath()
;
声明直线段起点:ctx.moveTo(10, 10)
// 声明要在相对于canvas左上角,left: 10px, top: 10px; 的地方为线段起点
声明直线段终点:ctx.lineTo(100, 100)
// 声明要在(100, 100)的点为线段终点
声明直线段颜色:ctx.strokeStyle = 'red'
声明直线段的宽度:ctx.lineWidth = '5'
绘制描边:ctx.stroke()
// 将颜色宽度进行边填充,不填充上面定义的线颜色盒宽度不会生效
关闭画直线的声明:ctx.closePath()
// 关闭画直线的声明,完成此次绘制
ctx.lineTo
多执行几遍,就可以绘制折线,矩形等等通过多条直线绘制围成矩形,然后进行边填充上色
ctx.rect(x, y, width, height)
; // 声明绘制矩形
ctx.fillStyle = 'red'
; // 声明填充颜色
ctx.fill()
; // 绘制填充
ctx.fillRect(x, y, width, height)
; 相当于上面rect + fill
以底部线平齐:y = 指定平齐线y位置 - height:用户绘制柱状统计图使用
ctx.strokeRect(x, y, width, height)
; 相当于rect() + stroke(); // 绘制空心矩形
// 可以先定义线的样式,然后再使用绘制空心矩形
setTimeOut
开始简单动画了ctx.clearRect(x, y, width, height);
清除一块画布区域ctx.fillStyle = 'rgba(255,255,255,0.3)'
;就可以了圆也属于路径,路径: ctx.beginPath()
arc(x, y, radius, startDeg, endDeg, antic)
;
// (x, y)圆心,radius半径, startDeg开始弧度,endDeg结束弧度, antic是否逆时针,默认true
第二个ctx.beginPath()
会终止第一个beginPath()
, 既携带一个closePath
属性
arcTo(x1, y1, x2, y2, radius)
; 拉弓弧:一条直线段,拉中间某点形成的弧度
// (x1, y1)作用点1,(x2, y2)作用点2,radius半径
/* 案例 */
const ctx = document.getElementById('canvas'),getContext('2d')
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.arcTo(150, 100, 200, 40, 40);
ctx.lineTo(200, 40);
ctx.stroke();
ctx.closePath();
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
; 绘制塞贝尔曲线
// (cp1x, cp1y)控制点1,(cp2x, cp2y)控制点2,(x, y)结束点
/* 案例 */
const ctx = document.getElementById('canvas'),getContext('2d')
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.bezierCurveTo(100, 100, 200, 40, 250, 100);
ctx.stroke();
ctx.closePath();
ctx.font = 10px/10px '微软雅黑'
ctx.textAlign = 'center'
ctx.fillText('hello world', 10, 50)
; 参数: src, x, yctx.strokeText('hello world', 10, 50)
; 参数: src, x, y创建图片对象:var img = new Image()
;
设置图片来源:img.src = '/path'
;
插入图片:
img.onload = function() {
ctx.drawImage(img, x, y, width, height, clipX, clipY, clipW, clipH)
//img对象,(x, y)坐标,width, height图片大小,(clipX, clipY)裁剪切片坐标, clipWidth, clipHeight切片大小
}
或插入图片:ctx.drawImage(document.getElementById(img), 0, 0, 100, 100)
平铺:
相册:
画廊: 相册带有间距的平铺渲染
var lineargradient = ctx.createLinearGradient(0,0,150,150);
// 表示渐变的起点 (x1,y1) 与终点 (x2,y2)
lineargradient.addColorStop(0,'white');
lineargradient.addColorStop(0.5,'white');
// 可以在0-1之间放很多
lineargradient.addColorStop(1,'black');
var radialgradient = ctx.createRadialGradient(45,45,10,52,50,30);
// 前三个定义一个以 (x1,y1) 为原点,半径为 r1 的圆,后三个参数则定义结束圆以 (x2,y2) 为原点,半径为 r2 的圆。
radialgradient.addColorStop(0,'white');
// 可以在0-1之间放很多
radialgradient.addColorStop(1,'black');
ctx.shadowOffsetX = 10
;ctx.shadowOffsetY = 10
;ctx.shadowBlur = 3
;ctx.shadowColor = "red"
;保存当前状态:ctx.save()
;
释放保存状态:ctx.restore()
;
// 上面两个是成对存在的,可以有包裹性
// 意义:变形后需要保存变形后一刻的快照,才能完成每一帧变化连续动画
偏移移动:ctx.translate(x, y)
:x, y 为移动相对自身距离
中心旋转:ctx.rotate(angle)
; 只有一个旋转角度参数
// 改变中心点通过ctx.translate(x, y)
改变
放缩:ctx.scale(x, y)
; x y 为放缩比例
使用ctx.translate(0,canvas.height); ctx.scale(1,-1)
,
// 以y轴作为对称轴镜像反转
复合:context.transform(a,b,c,d,e,f)
;
// a: 水平缩放绘图, b: 水平倾斜绘图, c: 垂直倾斜绘图, d: 垂直缩放绘图, e: 水平移动绘图, f: 垂直移动绘图.
合成:ctx.globalCompositeOperation = value
?(属性看一遍)
路径区域裁剪:ctx.clip()
// 使用线段的方法绘制一块路径,然后使用clip()进行裁剪
裁剪案例
/* 案例 剪裁路径是三角形
context.beginPath();
context.moveTo(20, 20);
context.lineTo(200, 80);
context.lineTo(110, 150);
context.clip(); // 剪裁
*/
loading…
loading…
loading…
loading…
loading…
loading…
loading…
loading…
cs