惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
T
Threat Research - Cisco Blogs
N
News and Events Feed by Topic
Hacker News: Ask HN
Hacker News: Ask HN
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 叶小钗
Security Latest
Security Latest
Spread Privacy
Spread Privacy
aimingoo的专栏
aimingoo的专栏
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
U
Unit 42
Cyberwarzone
Cyberwarzone
小众软件
小众软件
Scott Helme
Scott Helme
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
爱范儿
爱范儿
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Schneier on Security
Schneier on Security
Latest news
Latest news
GbyAI
GbyAI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
The Register - Security
The Register - Security
WordPress大学
WordPress大学
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
PCI Perspectives
PCI Perspectives
Jina AI
Jina AI
AI
AI
NISL@THU
NISL@THU
I
Intezer
G
GRAHAM CLULEY
B
Blog
S
Secure Thoughts
IT之家
IT之家
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
V2EX - 技术
V2EX - 技术
Recorded Future
Recorded Future
Hacker News - Newest:
Hacker News - Newest: "LLM"

博客园 - 编程我的一切

Apache Hop实战:Windows平台MySQL数据迁移的深度排错与性能调优 线程与进程的区别与联系:操作系统入门详解(含 Python 示例) 打破同源枷锁:深入理解 postMessage 跨域通信机制 三大搜索引擎 URL 推送 API 详解:百度、必应、谷歌 PandasAI:当数据分析遇上自然语言处理 Windows 左ctrl和左alt键互换 Bootstrap下拉菜单、按钮式下拉菜单 SSM三大框架的运行流程、原理、核心技术详解 app启动速度怎么提升? SSM框架整合(Spring + SpringMVC + MyBatis) Lambda入门 Spring boot+CXF开发WebService Demo HTML5中的Web Notification桌面通知 Open3d之交互式可视化 行为识别TSM训练ucf101数据集 Python3列表、元组及之间的区别和转换 Java 字符串简介 Shell从入门到精通 基于go-cqhttp实现QQ机器人
canvas画布基本知识点总结
编程我的一切 · 2021-02-17 · via 博客园 - 编程我的一切
  • HTML5的canvas元素使用JavaScript画图;
<canvas width="600" height="400">  </canvas>

canvas画图的基本框架

  • 画布默认背景颜色为白色,大小为300*150;
  • 若要设置画布大小,不建议在style的样式设置尺寸,效果相当于将原本300*150的画布等比例放大缩小,包括里面画的图;
  • 建议在元素本身设置;
<body>
    <!-- 准备画布 -->
    <canvas width="600" height="400"></canvas>
    <!-- 准备绘制工具 -->
    <!-- 利用工具绘图 -->
    <script>
        

关于线条的问题

  1. 默认宽度为1px
  2. 默认颜色黑色
  3. 但是显示是灰色,2px宽度,原因是对其点是线的中心位置,会把线分成两个0.5px,显示的会是不饱和增加宽度;
  4. 解决方法:前或后移动0.5px即可;
  • 当要画多条不同样式的平行线时,存在样式覆盖问题,需要开辟新路径;
<body>
    <canvas width="600" height="400"></canvas>
    <script>
        var myCanvas=document.querySelector("canvas");
        var ctx=myCanvas.getContext("2d");
        
  • 当绘制图形,需要填充颜色时,使用fill()函数;默认填充颜色为黑色;
<body>
    <canvas width="600" height="400"></canvas>
    <script>
        var myCanvas = document.querySelector("canvas");
        var ctx = myCanvas.getContext("2d");
        
  • 当绘制封闭图形时,会出现起始点和lineTo的结束点无法完全闭合,有缺角
    在这里插入图片描述
  • 解决方法:使用canvas的自动闭合路径closePath();
<canvas width="600" height="400"></canvas>
    <script>
        var myCanvas = document.querySelector("canvas");
        var ctx = myCanvas.getContext("2d");
        

填充规则(非零环绕)

在这里插入图片描述

  • 看一块区域是否被填充,从区域画一条直线,看和这条直线相交的轨迹;
  • 如果是顺时针就+1,逆时针就-1;
  • 计算所有轨迹的和,如果非0就填充,是0就不填充;
  • 如上图1区域:轨迹和为1,填充;2区域:轨迹和为2,填充;3区域:轨迹和为0,不填充;
    在这里插入图片描述

画虚线

<script>
        var myCanvas = document.querySelector("canvas");
        var ctx = myCanvas.getContext("2d");
        

在这里插入图片描述

  • 画虚线:通过数组描述虚线的排列方式;
  • 获取虚线的排列方式,获取的是不重复的那一段的排列方式;
  • 例如:console.log(ctx.setLineDash());获取的是5 10 15 5 10 15;
  • 括号里数字为[数字长度,空格长度,数字长度,空格长度…];

画渐变矩形(例如黑白渐变)

  • 主要利用for循环,逐渐改变线条颜色,矩形通过多个线条拼凑;
<body>
    <canvas width="600" height="400"></canvas>
    <script>
        var myCanvas = document.querySelector("canvas");
        var ctx = myCanvas.getContext("2d");
        

网格、坐标系、点的绘制

  • 网格即多条线按一定的规则排列组成;
  • 坐标系绘制两条相互垂直的有向线段,箭头自己计算画三角形,进行填充即可;
  • 点的绘制
  • 需要注意的是,点的坐标要先定下来,用对象存储
  • 点的绘制就是以点的坐标为中心,绘制一个正方形,进行填充,点的大小可以控制;
<body>
    <canvas width="600" height="400"></canvas>
    <script>
        var myCanvas = document.querySelector('canvas');
        var ctx = myCanvas.getContext('2d');
        

图形绘制

在这里插入图片描述

  • 参数(x,y)为坐标,(w,h)为宽高;

弧度绘制

  • 什么是弧度?
  • 一种长度的描述单位,一个圆有2Π个弧度,一个角度等于Π/180弧度
<body>
    <canvas width="600" height="400"></canvas>
    <script>
        var myCanvas = document.querySelector('canvas');
        var ctx = myCanvas.getContext('2d');
        
  • 绘制扇形时,圆心的确定要放在画弧形的前面;

绘制文本

  • ctx.font='微软雅黑’设置字体;
  • strokeText(text,x,y,maxWidth);
  • fillText(text,x,y,maxWidth);
  • text即要绘制的文本;
  • x,y为文本绘制的坐标(文本左下角);
  • maxWidth设置文本的最大宽度,可选参数;
  • ctx.textAlign文本水平对齐方式,相对绘制坐标来说;
  • 可取值有 left center right start默认 end
  • ctx.direction属性css(rtl ltr)start和end与此相关;
  • 若为ltr则start和left表现一致;
  • 若为rtl则start和right表现一致;
  • ctx.textBaseline设置基线(垂直对齐方式);
  • top文本的基线处于文本的正上方,并且有一段距离;
  • middle文本的基线处于文本的正中间
  • bottom文本的基线处于文本的正下方,并且有一段距离;
  • hanging文本的基线处于文本的正上方,并且与文本粘合;
  • alphabetic默认值,文本的基线处于文本的正下方,并且穿过文字;
  • ideographic和bottom相似,但是不一样;
  • measureText()获取文本的宽度obj.width;
  • 注意
  • 文本样式设置要在文本描边或者填充之前;
  • 左右对齐方式的对齐基准是文字描绘的起始坐标;

图片绘制

  • drawImage()
  • 三个参数drawImage( image, x , y);
  1. img图片对象、canvas对象、video对象
  2. x,y图像绘制的左上角
  • 五个参数drawImage( image, x , y , w, h);
  • w,h分别为图形的宽高设置,是缩放,不是截取,其余参数意义同上;
  • 九个参数drawImage( image, x , y , w , h, x1, y1 ,w1, h1);
  • image是图片对象,x,y是图片定位的坐标(即原图片上图片从哪开始截取),w,h是在原图片上的图片截取区域大小,x1,y1是绘制在画布上的坐标,w1,h1是绘制图片的大小,绘制的图片不是裁剪而是前面截取图片的缩放

canvas的2d转换

  • 移动, translate(x,y);移动的是坐标轴,不是绘制的内容
  • 缩放,scale(0.5,1),表示横坐标缩放0.5倍,纵坐标缩放1倍,缩放的是坐标轴,不是绘制的内容
  • 旋转,rotate(),旋转中心默认是坐标原点;