详细解读canv的基本语法

简介: 详细解读canv的基本语法

可用的绘图技术:

(1)Canvas技术 —— 专用于绘制2D图形/图像

(2)SVG技术 —— 专用于绘制矢量图

(3)WebGL技术 —— 目前不是HTML5标准技术,功能最强大,3D图形/图像

1.Canvas绘图技术 —— 最重要难点

HTML5引入了标签用于绘图,默认是一个300150的inline-block。使用width/height属性指定尺寸,但不能使用CSS样式指定宽和高!

您的浏览器不支持Canvas标签!

往“画布”上绘图需要使用其对应的“画笔”对象:

var ctx = c.getContext('2d'); //绘图上下文——“画笔”

接下来所有的绘图任务都由画笔实现。

Content:内容

Context:上下文

绘图上下文对象的常用属性——console.log(ctx):

fillStyle:'#000',填充样式

strokeStyle:'#000',描边/轮廓样式

lineWidth:1,描边/轮廓的宽度

font:'10px sans-serif',绘制文本所用的字号/字体

textBaseline:'alphabetic',文本对齐的基线

showdowOffsetX:0,阴影水平偏移量

showdowOffsetY:0,阴影竖直偏移量

showdowColor:'rgba(0,0,0,0)',阴影颜色

showdowBlur:0,阴影模糊半径

2.使用Canvas绘制矩形

提示:矩形的定位点在自己左上角

ctx.fillStyle = '#000' 填充颜色

ctx.strokeStyle = '#000' 描边颜色

ctx.fillRect(x,y,w,h) 填充一个矩形

ctx.strokeRect(x,y,w,h) 描边一个矩形

ctx.clearRect(x,y,w,h) 清除一个矩形范围内的所有内容

3.使用Canvas绘制文本

提示:文字的定位点默认在文本基线的起点(左侧)

ctx.textBaseline = 'alphabetic' 文本基线,可取为top/bottom/middle/alphabetic

ctx.fillText(txt, x, y) 填充文本

ctx.strokeText(txt, x, y) 描边文本

ctx.measureText(txt).width 测量,根据当前指定的字号和字体计算指定文本的宽度

4.使用Canvas绘制路径(Path)

提示:Canvas中的路径概念与Photoshop中钢笔工具类似的。路径本身是不可见的,有三个用途:描边、填充(闭合)、裁剪(闭合)

Canavs中与路径绘制相关方法:

ctx.beginPath() //开始一条新路径

ctx.closePath() //闭合路径,让最后一个锚点自动连接到第一个锚点

ctx.moveTo(x, y) //移动到指定点

ctx.lineTo(x,y) //从当前点到指定点绘制直线路径

ctx.arc() //绘制拱形路径

ctx.ellipse() //绘制椭圆路径

ctx.bezierCurveTo() //绘制贝塞尔曲线路径

--

ctx.stroke()

ctx.fill()

ctx.clip()

5.使用Canvas绘制图像

提示:图片的定位点在图片的左上角。客户端JS必须等待图片加载完成才能开始绘制。

var img = new Image();

img.src = 'x.jpg';

img.onload = function(){

//图片已经加载完成了

ctx.drawImage(img, x, y) //使用默认的宽高

ctx.drawImage(img, x, y, w, h)

}

小结:Canvas绘图可以绘制的内容:

(1)矩形: ctx.fillRect() ctx.strokeRect() ctx.clearRect()

(2)文本: ctx.fillText() ctx.strokeText() ctx.measureText()

(3)路径 - 描边/填充/裁剪

ctx.beginPath() ctx.closePath()

ctx.moveTo() ctx.lineTo() ctx.arc()

ctx.stroke() ctx.fill() ctx.clip()

(4)图像: ctx.drawImage()

绘图上下文的状态改变和恢复 —— 难点晦涩

var ctx = canvas.getContext('2d');

//可以将绘图上下文对象(即画笔对象)进行变形(transform)——与对Canvas施加CSS Transform样式不同,绘图上下文的变形只影响当前绘制的图形图像内容

ctx.translate(x,y) //坐标轴原点平移到指定点,所有点的坐标都发生改变

ctx.rotate(deg) //画笔旋转,则内容旋转,轴点在坐标轴原点

ctx.scale() //画笔缩放

====================

ctx.save() //保存绘图上下文(画笔)当前的变形数据

ctx.restore() //恢复最近一次保存的画笔的变形相关的状态

相关知识点主意事项

1.如何等待所有图片加载完成后,才开始绘图?

多张图片绘制需要按照特定的顺序,而加载完成顺序是完全无法预测,只能等待所有图片加载完成,才能开始绘制。

/**

//典型的错误代码

var img1 = new Image();

img1.src = "";

img1.onload = function(){

ctx.drawImage(img1, x, y);

}

var img2 = new Image();

img2.src = "";

img2.onload = function(){

ctx.drawImage(img2, x, y);

}

**/

var progress = 0; //加载进度 0~100

var img1 = new Image();

img1.src = "";

img1.onload = function(){

progress += 80;

if(progress===100){

startDraw();

}//代码效果参考:http://www.ezhiqi.com/zx/art_6990.html

}

var img2 = new Image();

img2.src = "";

img2.onload = function(){

progress += 20;

if(progress===100){

startDraw();

}

}

2.如何为Canvas上的图形/图像绑定事件监听?——难点

网页只能为DOM元素绑定监听函数,Canvas绘图技术中只要一个Canvas元素,其它图形图像都不是元素——无法进行事件绑定!——

解决办法:为Canvas绑定监听函数,获取事件发生的坐标,是否处于目标图形/图像所在范围内——只能为规则的图形“绑定”监听

Adobe Photoshop:处理位图——每幅图像由点(rgb)组成,善于描述颜色的细节变化,可用于照片等领域——放大后会出现马赛克失真。

Adobe Illustrator:处理矢量图——每幅图像由线条(需要指定方向、值),可以无限缩放而不失真——不善于描述颜色的细节变化。

相关文章
|
JavaScript 前端开发 索引
js的增删改查
js的增删改查
197 0
|
Java 关系型数据库 MySQL
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
|
Ubuntu 网络安全 图形学
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
在Ubuntu 20.04系统中解决网络图标消失和无法连接有线网络问题的方法,其中第三种方法通过检查并确保Windows防火墙中相关服务开启后成功恢复了网络连接。
5557 0
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
1068 2
|
Kubernetes Java jenkins
SpringCloud微服务实战——搭建企业级开发框架(三十五):SpringCloud + Docker + k8s实现微服务集群打包部署-集群环境部署【下】
• sonarqube默认用户名密码: admin/admin • 卸载命令:docker-compose -f jenkins-compose.yml down -v 六、Jenkins自动打包部署配置   项目部署有多种方式,从最原始的可运行jar包直接部署到JDK环境下运行,到将可运行的jar包放到docker容器中运行,再到现在比较流行的把可运行的jar包和docker放到k8s的pod环境中运行。每一种新的部署方式都是对原有部署方式的改进和优化,这里不着重介绍每种方式的优缺点,只简单说明一下使用Kubernetes 的原因:Kubernetes 主要提供弹性伸缩、服务发现、自我修复,
1099 57
SpringCloud微服务实战——搭建企业级开发框架(三十五):SpringCloud + Docker + k8s实现微服务集群打包部署-集群环境部署【下】
|
存储 JSON NoSQL
【文档数据库】ES和MongoDB的对比
【文档数据库】ES和MongoDB的对比
1342 1
|
存储 数据挖掘 数据库
【办公自动化】使用Python一键往Word文档的表格中填写数据
【办公自动化】使用Python一键往Word文档的表格中填写数据
1422 1
|
Java Linux 数据安全/隐私保护
Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
【2月更文挑战第3天】Java 将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
1265 0
|
存储 传感器 边缘计算
物联网体系架构解析:感知、通信与智能的融合
本篇深入剖析了物联网体系架构的关键要素,围绕感知、通信与应用层,以及边缘计算和云计算的角色进行了详细探讨。在感知层,各种传感器、执行器和物理设备的作用被阐述,它们负责采集环境数据和执行操作。传输层则负责数据传输和通信,确保感知层数据能够流畅传送。而应用层是物联网的最终目标,集成了各类应用和服务,通过分析传输层数据来实现智能化决策和控制。
2013 0
|
存储 安全 Linux
GPU机器docker环境离线安装
GPU机器docker环境离线安装
2306 0

热门文章

最新文章