前端开发系列024-基础篇之Canvas绘图(基础)
一、Canvas简单介绍

Canvas 是HTML5提供的一种新标签。
<canvas id="canvas" width="400" height="300"></canvas>
Canvas 是一个矩形区域的画布,在画布上面我们可以通过javaScript控制每一个像素来绘制图形。
Canvas 标签使用javaScript在网页上绘制图像,其本身不具备绘图功能。通过使用canvas并调用相关API,可用多种方式来绘制路径、矩形、圆形、字符以及图像等。
最早[Canvas]()由Apple公司引入到WebKit内核,用于Mac OSX的Dashboard,后来又在Safari和Google Chrome中被实现。[Canvas]()标签是WhatWG Web applications 1.0 规范的内容,也包含于HTML5中。
应用的领域和趋势
① 炫酷的场景秀:用Canvas实现动态的广告效果能够非常融洽的跨平台运行。
② 数据的可视化:各种统计类的图表(趋势图、饼状图、折线图等),已经有成熟的开源框架。
③ 游戏开发领域:Canvas是
HTML5游戏开发首选,其在基于Web的图像方面比Flash更立体和精巧。
[1] Web图形编辑器:
Photoshop图形编辑器将能够100%基于Web实现。
[2] 远程可视化控制:Canvas能更好的实现基于Web的数据传输以gous可视化控制界面。
[3] 各种类型模拟器:从视觉效果和核心功能等方面来说,模拟器可以完全由
JavaScript来实现。
参考资料 W3school 、 MDN_Canvas_API
HTML Canvas 2D Context
Canvas 标签默认拥有300 * 150的宽高,可以通过设置边框来查看。
Canvas 标签支持鼠标右键·(复制图片)·以及(图片另存为)的操作,同图片一致。

Canvas 标签的参考坐标系如上图所示,其Y轴的方向区别于常见的数学坐标系。
Canvas 标签的浏览器兼容很好(IE9+),若浏览器不兼容建议设置标签内容友好提示。
Canvas 标签本身并不能绘制图形只是画布,具体绘图工作主要有Canvas上下文对象完成。
Canvas 标签上下文对象是javaScript操作Canvas的接口,常用类型是CanvasRenderingContext2D。
Canvas 标签在设置画布宽度和高度的时候建议在标签中直接通过width和height属性节点来实现。
<canvas id="canvas" width="400px" height="300px">当前浏览器不支持canvas,请升级浏览器</canvas>
<script>
//01 获取canvas画布
var canvas = document.getElementById("canvas");
//02 获取canvas上下文对象
var ctx = canvas.getContext("2d");
//03 设置路径
//开启路径(可省略)
ctx.beginPath();
//设置路径的起点
ctx.moveTo(20,50);
//设置路径对应值
ctx.lineTo(100,50);
//设置线条(描边)颜色
ctx.strokeStyle = "red";
//04 绘制线条(描边)
ctx.stroke();
</script>
代码说明 上面的代码将会在canvas画布上绘制出一条红色的线条。
请不要使用`CSS`来控制[Canvas]() 标签的宽高,这样会导致内部图片拉伸和变形,如果重新设置[Canvas]() 标签的宽高属性将会擦除画布中已有的所有内容。
二、Canvas的基本使用

这里列出CanvasRenderingContext2D原型对象上面几乎所有的核心成员供参考。
canvas //当前的画布对象
filter //设置模糊和灰度等过滤效果
globalAlpha //设置透明度(0~1)
shadowBlur //阴影的模糊级别
shadowColor //阴影的颜色
shadowOffsetX //阴影距形状的水平距离
shadowOffsetY //阴影距形状的垂直距离
fillStyle //设置矩形填充的样式(颜色)
strokeStyle //设置描边样式
lineCap //线条末端的类型 round butt(默认) square
lineJoin //相交线的拐点类型 round miter(默认) bevel
lineWidth //设置线条的宽度
miterLimit //最大斜接长度(两条线交汇处内角和外角之间的距离)
lineDashOffset //设置虚线偏移量
font //设置字体的绘制参数(字号、字体、粗体等)
textAlign //设置文字的水平对齐方式
textBaseline //设置文字基线(垂直对齐方式)
globalCompositeOperation //设置如何将一个源(新)图像绘制到目标(旧)图像上
imageSmoothingEnabled //设置图片是否平滑(非稳定)
imageSmoothingQuality //设置图像平滑度的属性(非稳定)
moveTo() //设置路径(起点)
lineTo() //设置路径
beginPath() //开启路径
closePath() //关闭路径
setLineDash() //设置虚线宽度数据
getLineDash() //获取虚线宽度集合
rect() //绘制矩形
fillRect() //矩形填充
strokeRect() //设置描边(矩形)
clearRect() //擦除矩形区域内容
stroke() //设置描边
fill() //设置填充
clip() //剪切指定形状和尺寸的区域
arc() //绘制圆弧(圆)
arcTo() //绘制曲线
ellipse() //添加椭圆路径(非稳定)
bezierCurveTo() //绘制贝塞尔曲线(3)
quadraticCurveTo() //绘制贝塞尔曲线(2)
isPointInPath() //检查某个点是否在指定的路径中
isPointInStroke() //检查某个点是否在指定(范围)
createLinearGradient() //创建线性渐变
createRadialGradient() //创建放射状/环形的渐变
fillText() //矩形填充(绘制文字)
strokeText() //设置描边(文字绘制)
measureText() //获取并计算文本宽度
drawImage() //绘制图片
createImageData() //创建新的ImageData对象
getImageData() //获取ImageData对象(矩形区域的像素数据)
putImageData() //从指定ImageData对象中把图像放到画布上面
createPattern() //在指定的方向上重复指定的元素
drawFocusIfNeeded() //如有必要则绘制焦点
save() //保存状态
scale() //设置缩放
rotate() //设置旋转
restore() //返回之前保存过的路径状态和属性
translate() //平移(重新映射画布上的(0,0)位置)
transform() //替换绘图的当前转换矩阵
setTransform() //将当前转换重置为单位矩阵,然后运行transform()
resetTransform() //使用单位矩阵重新设置当前变形(非稳定)
画布的上下文CanvasRenderingContext2D对象为图形的绘制提供了丰富的接口,我们可以直接调用相关的API来绘制路径、圆弧和矩形等图案。此外,要得到目标图案其实有很多种方法到达罗马的路途并非只有一条,而所有复杂的图案都离不开点、线和面,而且它们应该是渐进的。
这里先在页面中提供一个400 * 300的画布,获取画布的上下文对象。
<canvas id="canvas" width="400px" height="200px"></canvas>
var ctx = document.getElementById("canvas").getContext("2d");
矩形点和圆形点的绘制
ctx.fillRect(10,10,5,5); //矩形点
ctx.arc(11.5,40,3,0,2 * Math.PI); //圆形点
ctx.fill(); //设置填充
线条的绘制
//方式(一) 通过绘制连续的矩形来绘制线条
//示例:(实线)
for(var i = 0 ; i < 80 ; i++)
{
ctx.fillRect(40 + (i * 1),25,1,1);
}
//示例:(虚线)
for(var i = 0 ; i < 20 ; i++)
{
ctx.fillRect(40 + (i * 4),40,2,2);
}
/*********************************************/
//方式(二) 通过路径的方式来绘制线条
//示例:(色度稀释的线条)
ctx.moveTo(40,60);
ctx.lineTo(320,60);
//示例:(色度正常的线条)
ctx.moveTo(40,70.5);
ctx.lineTo(320,70.5);
//设置描边
ctx.stroke();
面(矩形)的绘制
//方式(一) 以“矩形点” + 循环的方式来绘制矩形
for(var i = 0 ; i < 40 ; i++)
{
ctx.fillRect(20 + (i * 3),100,3,50);
}
//方式(二) 直接绘制矩形
ctx.fillStyle = "red";
ctx.fillRect(200,100,50,50);
这里贴出上面代码运行的结果图。

在使用canvas上下文绘制线条的时候,我们会发现线条最终的颜色看上去并不是黑色的感觉比较淡,此外线条的宽度看上去也并不是1px而是2px。其实,主要原因是在canvas在进行绘制的时候,对齐的点是线的中心位置,因此就会把线分成上下两个0.5px,在进行显示的时候会补齐,因此其色度自然也是不饱和的。在绘制的时候,可以考虑给绘制坐标设置0.5px的偏移量来解决。
前端开发系列024-基础篇之Canvas绘图(基础)的更多相关文章
- openlayers5-webpack 入门开发系列一初探篇(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- Pyhton开发【第五篇】:Python基础之杂货铺
Python开发[第五篇]:Python基础之杂货铺 字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进 ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- 前端开发工程师 - 02.JavaScript程序设计 - 第1章.基础篇
第1章--基础篇 JS介绍 html 网页的内容:css 网页的样式:javascript 网页的行为 i.e. hello world <!DOCTYPE html> <html& ...
- [置顶]【实用 .NET Core开发系列】- 导航篇
前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...
- 旨在脱离后端环境的前端开发套件 - IDT Server篇
IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...
- 前端开发【第2篇:CSS】
鸡血 样式的属性多达几千个,但别担心,按照80-20原则,常用的也就几十个,你完全可以掌握它. Css初识 HTML的诞生 早期只有HTML的时候为了让HTML更美观一点,当时页面的开发者会把颜色写到 ...
- openlayers4 入门开发系列之风场图篇
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
随机推荐
- Greenplum常用命令、函数
Greenplum常用查询命令 #查看test_bd事务(即数据库)下的所有表名包含 user 的 表信息 SELECT UPPER(A.SCHEMANAME) AS SCHEMANAME, UPPE ...
- unity手机花屏
关于Camera组件中Clear Flags的理解 - 知乎 (zhihu.com) https://blog.csdn.net/yanchezuo/article/details/77337755 ...
- 记一次 .NET某云HIS系统 CPU爆高分析
一:背景 1. 讲故事 年前有位朋友找到我,说他们的系统会偶发性的CPU爆高,有时候是爆高几十秒,有时候高达一分多钟,自己有一点分析基础,但还是没找到原因,让我帮忙看下怎么回事? 二:CPU爆高分析 ...
- Python日志模块Logging使用指北
Python日志模块Logging使用指北 作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 Logging模块是Python中一个很重要的日志模块,它提供了灵活 ...
- 2025dsfz集训Day8:线段树
Day8:线段树 前言:线段树听起来很高大尚,就是儿子节点表示法的树.几乎一样. \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特 ...
- 电商商品推荐系统实战:基于TensorFlow Recommenders构建智能推荐引擎
引言:推荐系统的商业价值与实现挑战 在电商领域,推荐系统承担着提升用户转化率和平台GMV的核心使命.根据麦肯锡研究,亚马逊35%的销售额来自推荐系统,Netflix用户75%的观看行为由推荐驱动.传统 ...
- xna 渲染3d图片
我们在做一个3d显示的时候为了突出模型的某些部位以及更好的区别某些模块我们需要渲染各种不同的颜色来体现, 下面代码演示: public void loade() { spriteBatch = new ...
- 掌握DevEco Studio模拟器这些“隐藏功能”,让鸿蒙应用调试效率事半功倍
在鸿蒙应用开发过程中,调试环节常常直接影响开发效率与体验.为提升开发者调试的便捷性与效率,华为在DevEco Studio上提供了模拟器功能,它不仅能模拟鸿蒙手机.折叠屏.平板等真实设备的基本功能,还 ...
- 7.9K star!跨平台开发从未如此简单,这个开源框架让APP开发效率飙升!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Lynx 是一个革命性的跨平台开发框架,使用 TypeScript 开发即可同时构建 iOS ...
- 1.3K star!像拿快递一样传送文件,这么酷!
嗨,大家好,我是小华同学,关注我们获得 "最新.最全.最优质" 开源项目和高效工作学习方法 trzsz 是一款革命性的文件传输工具,专为终端用户设计.它完美兼容传统 rz/sz 协 ...