canvas基本使用(获取画布、绘制矩形、清除屏幕内容、动画、绘制不规则图形、圆形、虚线、绘制文字、颜色渐变、设置阴影、渲染图片、变形偏移、canvas文档)

目录

canvas使用

获取画布

var canvas = document.getElementById(canvasID)

vat ctx = canvas.getContext('2d')

绘制矩形

ctx.fillStyle = 'red'

ctx.fillRect(100,100,200,50)

ctx.strokeStyle = 'blue'

ctx.strokeRect(300,100,200,50)

清除屏幕内容(动画)

ctx.clearRect(0,0,600,600)

像素化

绘制不规则图形

ctx.beginPath()

ctx.moveTo(100,100)

ctx.lineTo(200,200);

ctx.closePath()

ctx.strokeStyle = 'yellow'

ctx.stroke()

ctx.fillStyle = 'blue'

ctx.fill()

绘制圆形

ctx.arc(x,y,radius,start,end,anticlockwise)

设置绘制属性(线条属性、虚线等)

ctx.globalAlpha = 0.1

ctx.lineWidth = 1

ctx.lineCap = ’round‘

ctx.lineJoin = 'round'

ctx.setLineDash([4,20,...,])

绘制文字

ctx.font='30px 宋体'

ctx.fillText(str,x,y)

ctx.textAlign = 'center'

颜色渐变

let linear = ctx.createLinearGradient(100,100,200,200)

linear.addColorStop(0,'red')

设置阴影

ctx.shadowOffsetX|Y = 1

ctx.shadowBlur = 20

ctx. shadowColor = 'red'

渲染图片

ctx.drawImage(img,x0,y0,w0,y0,x1,y1,w1,h1)

变形偏移

ctx.save()

ctx.restore()

ctx.translate(x,y)

ctx.rotate(deg)

ctx.scale(x,y)

ctx.transform(a,b,c,d,e,f)

canvas.toDataURL(type,encoderOptions) 

html节点转canvas转base64图片下载示例(html2canvas)

示例使用方法解析

canvas文档


canvas使用

canvas标签的宽和高使用属性设置,用css的样式设置会导致画布失真。

获取画布

var canvas = document.getElementById(canvasID)

得到画布上下文,有两个分别为2d和3d的上下文,

vat ctx = canvas.getContext('2d')

选择2d的上下文,所有的图像绘制都是通过ctx属性或者事方法进行设置,和canvas标签没有关系了 。

绘制矩形

ctx.fillStyle = 'red'

设置下次填充内容的颜色为红色。注意要在绘制内容前设置颜色不然无法生效。

ctx.fillRect(100,100,200,50)

绘制填充矩形,前2个参数为x,y轴坐标,后2个参数为x、y轴方向的长度(x轴为水平向右,y轴垂直向下)。

ctx.strokeStyle = 'blue'

设置下次绘制线条颜色为蓝色。注意要在绘制内容前设置颜色不然无法生效。

ctx.strokeRect(300,100,200,50)

绘制矩形边框,前2个参数为x,y轴坐标,后2个参数为x、y轴方向的长度(x轴为水平向右,y轴垂直向下)。

清除屏幕内容(动画)

ctx.clearRect(0,0,600,600)

清除矩形范围内容,前2个参数为x,y轴坐标,后2个参数为x、y轴方向的长度。

像素化

使用canvas 绘制图片成功后就会像素化,无法从画布上再次得到这个图形(即无法修改画布内容,flash可以)。

注意canvas动画是通过清屏-更新-渲染的逻辑进行。

绘制不规则图形

ctx.beginPath()

创建路径

ctx.moveTo(100,100)

设置起点坐标。

ctx.lineTo(200,200);

设置下一点坐标以及连接方式为直线。

ctx.closePath()

封闭路径,将最后一点坐标和起点坐标相连。注意用fill填充时,不写该条语句也会自动相连。

ctx.strokeStyle = 'yellow'

设置边框颜色

ctx.stroke()

通过线条绘制图形轮廓。

ctx.fillStyle = 'blue'

设置填充颜色。

ctx.fill()

通过填充路径的内容区域生成实心的图形。

绘制圆形

ctx.arc(x,y,radius,start,end,anticlockwise)

绘制圆弧,x、y为绘制圆弧的圆心;radius为半径 ;start为起始弧度(0表示x轴即水平向右);end为结束弧度(顺时针时,是按起始弧度转end-start弧度,即相差2π时绘制的是圆,逆时针旋转时,是从start弧度逆时针转到end弧度,且start、end弧度是按照顺时针的弧度,大于2π时%2π);anticlockwise为是否逆时针转,false为顺时针旋转;

注意使用前需要beginPath

设置绘制属性(线条属性、虚线等)

ctx.globalAlpha = 0.1

设置线条的透明度,取值为0~1。

ctx.lineWidth = 1

设置线条的宽度,默认为1。

ctx.lineCap = ’round‘

设置线段末端结束方式,默认butt为方形结束,round为半圆型结束。

ctx.lineJoin = 'round'

设置线段连接处的样式,默认为miter为正常线性连接,round为连接处圆形,bevel为连接处底部为平的。

ctx.setLineDash([4,20,...,])

设置虚线,接受一个数组,数组第一位为实线长度,第二位为虚线长度即空白的长度,第三位为实线长度,以此类推,然后用数组的内容循环设置线段的虚实。

ctx.lineDashOffset = 4

设置起始的偏移量,如果设置为4,则上面从虚线即空白长度20开始。

绘制文字

ctx.font='30px 宋体'

设置字体大小和字体样式。

ctx.fillText(str,x,y)

绘制文字内容,x、y为绘制的起始坐标。

ctx.textAlign = 'center'

设置文本水平方向对齐方式,参数有start(默认)、end(文字都在起始坐标x轴左边)、center。

注意center表示基于起始坐标x轴居中,此时想让文本在整个canvas居中,设置fillText的x值为canvas的宽度一半即可。

颜色渐变

let linear = ctx.createLinearGradient(100,100,200,200)

设置颜色渐变的起始坐标和终点坐标,颜色会从起始坐标向总店坐标渐变

linear.addColorStop(0,'red')

设置起始坐标到终点坐标上的颜色,第一个参数为当前渐变的位置(0~1之间的小数,0表示起点,0.5表示中点,1表示终点,可设置多段,从0开始向1过程中设置的颜色渐变),第二个参数为颜色。

注意最后需要将颜色设置上去即ctx.fillStyle = linear。

设置阴影

ctx.shadowOffsetX|Y = 1

X为设置阴影向右偏离距离,Y为向下的偏离距离,负为方向。

ctx.shadowBlur = 20

设置模糊状态

ctx. shadowColor = 'red'

设置阴影颜色。

渲染图片

ctx.drawImage(img,x0,y0,w0,y0,x1,y1,w1,h1)

img为图片对象,

接受3个参数时(img,x,y):x、y为图片加载位置,即渲染图片的左上角坐标起点。

注意由于图片渲染是异步的,要在onload事件中渲染

let img = new Image();
img.src = '图片地址'
img.onload = function() {
    ctx.drawImage(img,100,100)
}

接受5个参数时(img,x,y,w,h): x、y为图片加载位置,即渲染图片的左上角坐标起点。w为宽度,h为高度。

接受9个参数时(img,x0,y0,w0,y0,x1,y1,w1,h1):x0、y0、w0、h0表示从图片x0、y0位置裁剪w0宽、h0高的图片;x1、y1为图片加载位置,即渲染图片的左上角坐标起点。w1、h1为图片最后的宽、高。

变形偏移

canvas可以进行变形偏移,变形的是整个画布的渲染区域。

注意canvas的每次绘制都是在上次的基础上,通过save、restore可以重新定义绘制的状态。

ctx.save()

保存画布的颜色、透明度等属性(strokeStyle、fillStyle、gloabalAlpha、lineWidth、lineCap、lineJoin、miterLimit、lineDashOffset、shadowOffsetX|Y、shadowBlur、shadowColor、font、textBaseline、direction、translate等),将每次所有的属性放入一个栈中。

ctx.restore()

恢复canvas状态,canvas状态是当前画面应用的所有样式和变形的一个快照。从save存放的栈中取出一次状态.

ctx.translate(x,y)

绘制内容左上角起点坐标偏移到x、y,水平向右和竖直向下为正向。

ctx.rotate(deg)

图案顺时针旋转deg弧度,初始圆心为图片的左上角顶点(可以通过translate改变圆心,x、y负数时相当于圆心在水平和竖直方向上正向移动)

ctx.scale(x,y)

图案在x、y轴方向的缩放倍数,默认为1,大于1代表放大,小于1代表缩小。

ctx.transform(a,b,c,d,e,f)

是上述属性的综合写法,a、d表示水平和竖直防线的;b、c为竖直和水平防线的倾斜偏移;e、f为水平和竖直方向的移动。

canvas.toDataURL(type,encoderOptions) 

将指定canvas内容转换为base64编码的图片图片转换为base64位编码后,图片会跟随代码(html、css、js)一起请求加载,不会单独进行请求加载),canvas为html中canvas节点而不是画布上下文。type为指定的格式(image/png、image/jpeg、image/webp等,默认为image/png);encoderOptions为用于设置转换为base64编码后图片的质量,取值范围为0-1,超出范围用默认值0.92代替。

html节点转canvas转base64图片下载示例(html2canvas)

注意html节点中如果有img标签,避免图片渲染不出来,需要设置属性crossOrigin="anonymous"。

Allowing cross-origin use of images and canvas - HTML: HyperText Markup Language | MDN

html标签中crossOrigin、integrity属性详解_YF-SOD的博客-CSDN博客 

import html2canvas from "html2canvas";
const downloadFile = (content, fileName) => {
  //下载base64图片
  let base64ToBlob = function (code) {
    let parts = code.split(";base64,");
    let contentType = parts[0].split(":")[1];
    let raw = window.atob(parts[1]); //base64解码
    let rawLength = raw.length;
    let uInt8Array = new Uint8Array(rawLength);
    for (let i = 0; i < rawLength; ++i) {
      uInt8Array[i] = raw.charCodeAt(i); //将每一位转换为unicode编码
    }
    return new Blob([uInt8Array], {
      //生成二进制流
      type: contentType,
    });
  };
  let aLink = document.createElement("a");
  let blob = base64ToBlob(content); //new Blob([content]);
  let evt = document.createEvent("htmlEvents");
  evt.initEvent("click", true, true); //initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
  aLink.download = fileName;
  aLink.href = URL.createObjectURL(blob);
  aLink.click();
};
const DPR = () => {
  if (window.devicePixelRatio && window.devicePixelRatio > 1) {
    return window.devicePixelRatio;
  } else {
    return 1;
  }
};
const downloadDomPng = async () => {
  const dom = document.getElementById("convertCanvasDom"); // 获取想要转换的 DOM 节点
  const box = window.getComputedStyle(dom);
  const width = box.width; // 根据DOM节点设置宽高
  const height = box.height;
  const scaleBy = DPR(); // 获取像素比-防止模糊
  const canvas = document.createElement("canvas"); // 创建自定义 canvas 元素
  canvas.width = width * scaleBy; // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
  canvas.height = height * scaleBy;
  // 设定 canvas css宽高为 DOM 节点宽高
  canvas.style.width = `${width}px`;
  canvas.style.height = `${height}px`;
  return await html2canvas(dom, {
    canvas,
    proxy: "https://baidu.com", //设置和线上相同的域名地址
    useCORS: true,//true加载跨域图像的配置
  }).then((canvas) => {
    downloadFile(canvas.toDataURL("image/png"), "filename");
  });
};

示例使用方法解析

URL.createObjectURL、URL.revokeObjectURL、Uint8Array、Blob使用详解_YF-SOD的博客-CSDN博客

canvas文档

Canvas - Web API 接口参考 | MDN