【通用行业开发部】canvas学习

简介: canvas在前端开发过程中是我们会经常遇到,如html2canvas、echarts等等,都使用到了canvas能力。本文参考MDN,简单的对canvas做了一个介绍和功能梳理。

一、canvas简介

1、canvas元素是html5的新增元素

2、canvas元素本身没有绘图能力,需要通过javascript和canvas元素标签来绘制图形

3、可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面

4、Canvas API主要聚焦于2D图形。而同样使用元素的 WebGL API 则用于绘制硬件加速的2D和3D图形

二、canvas元素知识

<canvas id="myCanvas" width="150" height="150">当前浏
览器暂不支持canvas, 请更换浏览器后再试</canvas>

1、canvas会初始化宽度为300px和高度为150px。该元素可以使用CSS来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果CSS的尺寸与初始画布的比例不一致,它会出现扭曲。(注意: 如果你绘制出来的图像是扭曲的, 尝试用width和height属性为canvas明确规定宽高,而不是使用CSS)

2、某些较老的浏览器(尤其是IE9之前的IE浏览器)或者文本浏览器不支持canvas,在这些浏览器会忽略容器并展示替代内容

3、canvas元素有一个叫做 getContext() 的方法,这个方法是用来获得渲染上下文和它的绘画功能,通过getContext()可以检查浏览器是否支持canvas

var canvas = document.getElementById('myCanvas');
if (canvas.getContext){
  //支持canvas
} else {
  // 不支持canvas
}

三、绘制

1、绘制形状

1.1移动笔触

moveTo():从一个点到另一个点的移动过程,我们通常会使用moveTo()函数设置起点,也能够用来绘制一些不连续的路径

1.2绘制直线

lineTo(x, y):绘制一条从当前位置到指定x以及y位置的直线

1.3绘制矩形

canvas提供了三种方法绘制矩形:

fillRect(x, y, width, height):绘制一个填充的矩形;

strokeRect(x, y, width, height):绘制一个矩形的边框;

clearRect(x, y, width, height):清除指定矩形区域,让清除部分完全透明

function draw() {
  var canvas = document.getElementById('myCanvas');
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');
    ctx.fillRect(25, 25, 100, 100);
    ctx.clearRect(45, 45, 60, 60);
    ctx.strokeRect(50, 50, 50, 50);
  }
}

1.4绘制路径

图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。以下是绘制路径所要用到的函数:

beginPath()新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径;closePath()闭合路径之后图形绘制命令又重新指向到上下文中;

stroke()通过线条来绘制图形轮廓;

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

function draw() {
  var canvas = document.getElementById('myCanvas');
  if (canvas.getContext) {
    var ctx = canvas.getContext('2d');
    ctx.beginPath();
    ctx.moveTo(75, 50);
    ctx.lineTo(100, 75);
    ctx.lineTo(100, 25);
    ctx.fill();
  }
}

1.5绘制曲线

arc(x, y, radius, startAngle, endAngle, anticlockwise):画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成;

arcTo(x1, y1, x2, y2, radius)根据给定的控制点和半径画一段圆弧,再以直线连接两个控制点;

quadraticCurveTo(cp1x, cp1y, x, y)绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点;

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点。

2、绘制文本

2.1、渲染文本

canvas 提供了两种方法来渲染文本:

fillText(text, x, y [, maxWidth]):在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的

strokeText(text, x, y [, maxWidth]):在指定的(x,y)位置绘制文本边框,绘制的最大宽度是可选的

2.2、文本样式

font = value:当前我们用来绘制文本的样式. 这个字符串使用和 CSS font 属性相同的语法. 默认的字体是 10px sans-serif。

textAlign = value:文本对齐选项. 可选的值包括:start, end, left, right or center. 默认值是 start。

textBaseline = value:基线对齐选项. 可选的值包括:top, hanging, middle, alphabetic, ideographic, bottom。默认值是 alphabetic。

direction = value:文本方向。可能的值包括:ltr, rtl, inherit。默认值是 inherit。

2.3、阴影效果

shadowColor:任何CSS中的颜色值,可以使用透明度

ShadowOffsetX:像素值,值为正数,向右移动阴影;值为负数,向左移动阴影

shadowOffsetY:像素值,值为正数,向下移动阴影;值为负数,向上移动阴影

shadowBlur:模糊值,值越大,阴影边缘越模糊

3、绘制图片

canvas有一项特性是图像操作能力。可以用于动态的图像合成或者作为图形的背景,以及游戏界面等等。浏览器支持的任意格式的外部图片都可以使用,比如PNG、GIF或者JPEG。 甚至可以将同一个页面中其他canvas元素生成的图片作为图片源。

引入图像到canvas里需要以下两步基本操作:

  1. 获得一个指向HTMLImageElement的对象或者另一个canvas元素的引用作为源,也可以通过提供一个URL的方式来使用图片
  2. 使用drawImage()函数将图片绘制到画布上
function draw() {
    var ctx = document.getElementById('myCanvas').getContext('2d');
    var img = new Image();
    img.onload = function(){
      ctx.drawImage(img,0,0);
    }
    img.src = 'https://mdn.mozillademos.org/files/5395/backdrop.png';
  }

其中drawImage 方法有三种形态:

drawImage(img,x,y):img 是 image 或者 canvas 对象,x 和 y 是其在目标 canvas 里的起始坐标

drawImage(img,x,y,width,height):这个方法多了2个参数,用来规定图像的宽度和高度

drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight):这种有8个新参数,用于控制做切片显示的;前4个是定义图像源的切片位置和大小,后4个则是定义切片的目标显示位置和大小

四、利用canvas下载图片

实现原理是使用drawImage()方法将图片画在画布上,然后调用toDataURL()方法,该方法返回一个包含图片展示的数据URL。具体实现如下:

function downloadFn(url){
  var Img = new Image(); //创建img实例
  Img.setAttribute('crossOrigin', 'anonymous'); //解决跨域Canvas污染问题
  Img.src=url;
  Img.onload=function(){ //图片加载是异步的,需要确保图片能够完整获取到
    var canvas = document.createElement('canvas'); //创建canvas元素
    canvas.width=Img.width, //设置canvas的宽高和图片一致
    canvas.height=Img.height;
    var context = canvas.getContext('2d');
    context.drawImage(Img,0,0,Img.width,Img.height); //绘制图片
    var dataURL=canvas.toDataURL('image/png'); //转换图片为dataURL
    var a = document.createElement('a'); //创建a标签,用于下载图片
    a.download = '图片';
    a.href = dataURL;
    a.click();  //触发点击下载
  };
}


相关文章
|
存储 Java 测试技术
【通用行业开发部】阿里开源TransmittableThreadLocal使用经验记录
本文章主要记录我在一次业务优化中,使用线程池带来的子父线程值传递问题,及使用TransmittableThreadLocal来解决该问题的经验,并对TransmittableThreadLocal原理做些梳理。
|
3月前
|
存储 机器学习/深度学习 数据管理
震惊!Delta Lake 以非凡之力掌控表的多个版本,开启数据管理奇幻之旅
【8月更文挑战第27天】Delta Lake作为大数据领域的一种高效数据湖存储层,其版本管理功能确保了数据的可靠性与可追溯性。通过记录所有表更改的事务日志,在系统故障或误操作情况下可恢复至特定版本。不同版本的数据独立存储并标记唯一标识符,便于管理和对比。此外,Delta Lake还采用了诸如自动合并小文件、支持索引和分区等策略来优化查询性能。这些特性共同使得Delta Lake成为一种强大且灵活的数据版本管理工具,在数据仓库、机器学习等多种场景下展现出巨大价值。
33 0
|
3月前
|
机器学习/深度学习 人工智能 搜索推荐
国内CRM系统TOP5,塑造企业智能管理新典范
国内CRM系统TOP5引领企业智能管理新典范。1、销售易CRM:凭借强大的数据分析能力、友好界面及高度定制化服务,集成AI技术提供深入客户洞察和自动化销售流程。2、金蝶云·星空CRM:依托金蝶集团实力,提供稳定性能与优秀客户服务。3、用友CRM:专注中小企业,易用性高,加速业务成长。4、红圈CRM:移动CRM领域领先,支持外出高效管理。5、外勤365:创新销售行为管理,提升执行力。这些系统通过客户洞察、自动化工作流、定制化服务及移动办公等功能,助力企业数字化转型,优化客户管理策略,增强市场竞争力。
|
5月前
|
人工智能 数据可视化 JavaScript
低代码平台先锋:Zoho Creator连续四年登榜技术价值矩阵
Zoho Creator连续四年入选Nucleus Research低代码平台领导者。该平台提供经济实惠的途径,无需深厚编码知识即可快速定制应用,尤其适合专业和非专业开发者。具备云部署、移动端兼容、拖放式界面、集成数据库及大量组件等特点。Nucleus Research赞扬其为快速应用开发提供强大工具。Zoho Creator自2006年以来已创建超700万个应用,拥有600万用户,支持多角色协作、自动化工作流和AI/ML功能,并注重数据安全。未来,Zoho Creator将继续强化低代码开发,助力企业数字化转型。
63 1
|
存储 算法 数据库
细数各大唯一id生成算法
一、序言几乎所有的业务系统,都有生成一个唯一id的需求,例如: 1.订单号2.活动id3.消息id这个记录标识往往就是数据库中的唯一主键,也可以作为唯一索引。这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: (1)拉取最新的一页的聊天记录:select * by message_id/ order by gmt_create/ limit 100 (2)拉取最近的一百条流水:selec
391 0
细数各大唯一id生成算法
|
存储 数据挖掘
Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——基础案例篇)(下)
Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——基础案例篇)(下)
|
供应链 Oracle 关系型数据库
Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——基础案例篇)(上)
Crystal Ball—甲骨文水晶球风险管理软件(概念以及实战——基础案例篇)(上)
|
机器学习/深度学习 SQL 人工智能
ID-Mapping在心动公司探索实践
文 / 蔡圣哲 王沛 戴健 范建文 王兵鹏
ID-Mapping在心动公司探索实践
|
运维 架构师 安全
技术​选型的艺术---湖北技术价值分享会
技术选型,不少技术从业的朋友容易进一些误区,而这些误区大多俗话是某种技术开发思维定势在作
281 0
技术​选型的艺术---湖北技术价值分享会
|
IDE 开发工具
从立创EDA,Gratipay看中文编程开发环境和推广运营的一个趋势
从立创EDA看库管理和分享功能;开源、开放式项目运营的经验教训。
1315 0
下一篇
无影云桌面