Skip to content

canvas画布

HTML canvas>标签用于通过脚本(通常是 JavaScript)动态绘制图形。

Canvas 绘图 API 都没有定义在 canvas>元素本身上,而是定义在通过画布的 getContext() 方法获得的一个“绘图环境”对象上,它使用的是路径表示法,有一系列的方法来定义,然后在对路径操作绘制

参考手册https://www.w3school.com.cn/tags/html_ref_canvas.asp

MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement

canvas标签

html
<canvas id="myCanvas" width="600" height="500">
抱歉,您的浏览器不支持canvas元素
(这里的内容将会在不支持<canvas>元素的浏览器或是禁用了JS的浏览器内渲染并展现)
</canvas>

标签属性

属性描述
width数字,600设置画布的宽,不带单位
height数字,600设置画布的高,不带单位

标签方法

canvas对象

创建context对象方法

javascript
let canvas = document.querySelector("canvas");
let cxt = canvas.getContext("2d");	//创建context对象,如果不支持则返回null

toDataURL方法

完整资料地址:https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toDataURL

javascript
// canvas转base64语法
// toDataURL([type],[图片质量]); 图片格式(默认为 image/png),图片质量(0-1,默认0.92)
var dataURL = canvas.toDataURL();	//得到的是base64字符串
//例如: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNby

toBlob方法

javascript
// canvas转文件对象语法
canvas.toBlob(function (blob) {
  // 这里的blob虽然不是文件对象,但相当于是文件对象,可以添加到FormData中上传
});

context对象

Canvas没有绘图能力, 所以需要通过本对象来操作进行绘图

创建对象

javascript
let canvas = document.querySelector("canvas");
let cxt = canvas.getContext("2d");	//创建context对象

样式设置

只记录了一些基本的常用设置

javascript
cxt.strokeStyle = 'red';    //设置画笔颜色
cxt.fillStyle = 'orange';   // 设置填充颜色
cxt.lineWidth = 10;	//画笔粗细

渐变色创建

javascript
// 创建渐变
var gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
gradient.addColorStop("0", "magenta");
gradient.addColorStop("0.5", "blue");
gradient.addColorStop("1.0", "red");
// 用渐变填色
ctx.strokeStyle = gradient;

清除画板

有多种方式能达到清除的目的

方式1----重设画布宽高后,画布内容就会被清空

javascript
var canvas = document.getElementById("myCanvas");  
var cxt = canvas.getContext("2d");  
canvas.height = canvas.height;  //重设高

方式2----clearRect方法

javascript
cxt.clearRect(0, 0, 600, 600);   // 清除画版

方式3----填充方式

javascript
//用图片对象填充画版方式
cxt.putImageData(imgData, 0, 0);
//填充颜色方式
cxt.fillStyle="#000000";  //设置填充颜色
cxt.beginPath();  //开始新的路径
cxt.fillRect(x,y,c.width,c.height);  //绘制“被填充”的矩形
cxt.closePath(); //创建路径

绘制

javascript
cxt.beginPath();    //开始新的路径
// 这里写绘制代码
cxt.closePath();	//结束路径
javascript
cxt.stroke(); //绘制已创建的路径
cxt.fill(); // 填充当前绘图路径
javascript
cxt.save();	//保存当前环境状态,然后进入新的画布环境
// 然后可以进行一系列的操作画布,绘制依然是绘制到先前环境上
cxt.restore();	// 退出新的环境,回到原来保存的绘图环境
cxt.rotate(弧度);	//旋转当前画布,注意0度是从3点钟角度开始
//弧度公式:弧度 = 角度 * PI / 180
javascript
cxt.translate(x,y);	//重新映射画布上的(0,0)位置,绘制圆的中心位置

写文本

javascript
//与CSS字体连写格式一致
cxt.font = '30px Georgia';	//font : style weight size family;
cxt.strokeText('欲写出的文本', x, y);	//绘制文本

绘制线条

javascript
cxt.beginPath();    //开始新的路径
cxt.moveTo(x,y);	//开始一条路径,并移动位置,不创建线条
cxt.lineTo(X, Y); //添加一个点,并创建线条,可创建多个,即可完成多条线
cxt.stroke(); //绘制已创建的路径

绘制矩形

javascript
ctx.rect(20,20,150,100);	//绘制矩形路径
//参数:开始x,开始y,矩形宽,矩形高

绘制圆

javascript
cxt.translate(x,y);	//重新映射画布上的(0,0)位置
cxt.arc(x, y, r, 0, 2 * Math.PI, false);   //创建绘图、弧、曲线、圆
//参数:圆中心x,圆中心y,半径,起始角,结束角,是否逆时针
// 起始角 和 结束角 使用的是弧度,弧度 = 角度 * Π / 180

ImageData对象

读取画板图片

javascript
imgData = cxt.getImageData(0, 0, 600, 600); // 保存当前画版
//参数:开始x,开始y,读取宽,读取高

设置画板图片

javascript
cxt.putImageData(imgData, 0, 0);    // 用图片填充画版
//参数:imgData对象,图片开始x,图片开始y,画布x,画布y,绘制宽,绘制高

Image对象

用于裁剪图片

javascript
var img = new Image();	//实例化对象
img.src = './123.jpg';
// 绑定图片加载完毕事件,因为图片较大加载时间不一定
img.onload = function(){
	//截取400*400大小,并缩放成100*100,放到画布中间
	ctx.drawImage(img,0,0,400,400,50,50,100,100)
    //把裁剪后的图片,转base64格式
    var str = canvas.toDataURL('image/png')
    //也可以把图片转文件对象
    var fileObj = canvas.toBlob(function(blob){
        console.log(blob);	//得到的blob可以追加到FormData中,提交使用
    })
}

drawImage方法参数

参数描述
img要使用的图像,画布,或视频
x可选,开始截切 x 坐标
y可选,开始截切 y 坐标
width可选,被裁剪图像的宽度,(要裁剪多宽)
height可选,被裁剪图像的高度,(要裁剪多高)
x可选,放在画布上的 x 坐标
y可选,放在画布上的 y 坐标
width可选,要使用的宽(放大或缩小图像)
height可选,要使用的高(放大或缩小图像)