当前位置: 首页 > news >正文

canvas 入门

canvas 入门

  • canvas是干什么的?
  • canvas 绘制直线
  • canvas画虚线
  • canvas 绘制三角形
  • canvas 绘制正方形
  • canvas 绘制圆形、圆弧与椭圆
  • canvas绘制文本
  • canvas绘制图片

canvas是干什么的?

<canvas> 是HTML5中的标签,它是一个容器,可以使用JS在其中绘制图形或文字。所以我们把重点放在绘制图的api上。

关于canvas的宽高:
一般来说通过标签属性来自定义宽高,通过css设置会失帧。

关于canvas画画的方向:
Canvas 使用的是 W3C 坐标系 ,也就是遵循我们屏幕、报纸的阅读习惯,从上往下,从左往右。

在这里插入图片描述

canvas 绘制直线

初体验,通过起始点与折点画线

<!-- 创建canvas标签: -->
<canvas id="canvas" height="600" width="700"></canvas><script>// 使用JS获得这个canvas标签的DOM对象const canvas = document.getElementById('canvas')// 决定是画二维还是三维的画const ctx = canvas.getContext('2d')// 定义画线的起始点ctx.moveTo(20, 100)// 定义画线的折点ctx.lineTo(100, 100)// 通过线条来绘制图形轮廓ctx.stroke()
</script>    

使用ctx.beginPath() 与 ctx.closePath()。来分隔画的线,防止样式覆盖。

设置线条的样式:可以设置宽度、颜色、透明度等等。具体看api

<!-- 关于canvas的定义:<canvas> 是HTML5中的标签,它是一个容器,可以使用JS在其中绘制图形或文字。 --><!-- 关于canvas的宽高:可以通过标签属性来自定义宽高,通过css设置会失帧,不如直接定义。 --><!-- 关于canvas画画的方向:Canvas 使用的是 W3C 坐标系 ,也就是遵循我们屏幕、报纸的阅读习惯,从上往下,从左往右。--><!-- 创建canvas标签: -->
<canvas id="canvas" height="600" width="700"></canvas>
<script>// 使用JS获得这个canvas标签的DOM对象const canvas = document.getElementById('canvas')// 决定是画二维还是三维的画const ctx = canvas.getContext('2d')// 定义画线的起始点ctx.moveTo(20, 100)// 定义画线的折点ctx.lineTo(100, 100)// 通过线条来绘制图形轮廓ctx.stroke()// 绘制第二条ctx.moveTo(10, 300)ctx.lineTo(100, 300)ctx.lineTo(100, 200)ctx.lineTo(200, 200)ctx.lineTo(200, 300)ctx.lineTo(300, 300)ctx.lineTo(300, 200)ctx.lineTo(400, 200)ctx.lineTo(400, 300)ctx.lineTo(500, 300)ctx.stroke()// 绘制线的样式,设置后,整个canvas都使用这个样式// 设置线的宽度ctx.lineWidth = 10 // 设置线的颜色ctx.strokeStyle = "skyblue"ctx.stroke()// 设置后,整个canvas都一个颜色,明显不符合我们的需求。// 所以需要使用ctx.beginPath() 与  ctx.closePath()。// 所以上面的线都是一个样式。ctx.beginPath()ctx.moveTo(100, 400)ctx.lineTo(100, 700)// 设置线的颜色ctx.strokeStyle = "red"ctx.stroke()ctx.beginPath()ctx.moveTo(300, 400)ctx.lineTo(300, 700)// 设置线的颜色ctx.strokeStyle = "green"ctx.stroke()// 还有一些其他的样式://strokeStyle = '颜色':设置线的颜色;//lineWidth = 数字:设置线的宽度;//lineCap = 'round/butt/square':设置线帽为圆型/默认/方形;//lineJoin = 'miter/round/bevel':设置线段连接处为默认/圆形/平直形式;//globalAlpha = 数字:设置图案的透明度</script>

canvas画虚线

与画实线类似,多了一个函数setLineDash(),用于设置虚线的透明线段。

setLineDash()可以有多个参数。
一个参数就是设置透明的线段。
多个参数的时候,偶数代表实线,奇数代表透明度

<canvas id="canvas" height="600" width="700"></canvas>
<script>canvas = document.getElementById("canvas");ctx = canvas.getContext("2d")// 画虚线ctx.beginPath()ctx.lineWidth = 10ctx.strokeStyle = 'skyblue'ctx.moveTo(200, 200)ctx.lineTo(500, 200)// 10个虚线点ctx.setLineDash([10])ctx.stroke()ctx.beginPath()ctx.moveTo(200, 300)ctx.lineTo(500, 300)// 下标为偶数的项为实线,为奇数项为透明线段,数字的大小代表着线段的长度。// 第一个是1/4,第二个是3/4ctx.setLineDash([10, 30])ctx.stroke()ctx.beginPath()ctx.moveTo(200, 400)ctx.lineTo(500, 400)// 下标为偶数的项为实线,为奇数项为透明线段,数字的大小代表着线段的长度.// 第一、二、三个分别是2/9、 2/3、 1/9    ctx.setLineDash([10, 30, 5])ctx.stroke()
</script>

canvas 绘制三角形

画三角形的原理就是画几条线,然后连接到一块

<!-- 创建canvas标签: -->
<canvas id="canvas" height="600" width="700"></canvas>
<script>// 画三角形的原理就是画几条线,然后连接到一块const canvas = document.getElementById('canvas')const ctx = canvas.getContext('2d')ctx.beginPath()ctx.moveTo(200, 200) ctx.lineTo(500, 200)ctx.lineTo(500, 500)// 第四个点要和第一个点的坐标一致才能画出三角形ctx.lineTo(200, 200)// 设置线段颜色为红色ctx.strokeStyle = 'red' ctx.stroke()ctx.closePath()
</script>

canvas 绘制正方形

矩形分为空心矩形 与 实心矩形。
实心矩形通过 fillStyle 属性来填充。

空心矩形的两种实现方式:
一 用直线硬画
二 用相应的api

<!-- 创建canvas标签: --><!-- 空心矩形:实现方式是画线条 -->
<canvas id="canvas" height="600" width="700"></canvas><!-- 填充矩形:实现方式 fillStyle = '颜色' 且使用 fillRect() -->
<script>const canvas = document.getElementById('canvas')const ctx = canvas.getContext('2d')// 画空心矩形// 方法一:用画线的方式ctx.beginPath()ctx.moveTo(200, 150)ctx.lineTo(500, 150)ctx.lineTo(500, 450)ctx.lineTo(200, 450)ctx.lineTo(200, 150)ctx.stroke()ctx.closePath()// 方法二:用画矩形的函数// 起点为(20,15),宽400像素,高400像素ctx.beginPath()ctx.strokeRect(20, 15, 400, 400) ctx.closePath()// 画填充矩形ctx.beginPath()ctx.fillStyle = 'red'ctx.fillRect(50, 60, 100, 100) ctx.closePath()
</script>

canvas 绘制圆形、圆弧与椭圆

使用arc(x, y, radius, startAngle, endAngle, anticlockwise)方法生成⚪/⌒。

<canvas id="canvas" height="600" width="700"></canvas>
<canvas id="canvas2" height="600" width="700"></canvas>
<script>const canvas = document.getElementById('canvas')const ctx = canvas.getContext('2d')ctx.beginPath()// 使用arc(x, y, radius, startAngle, endAngle, anticlockwise)方法生成⚪/⌒。// 再使用stroke()方法绘制圆。// 不写anticlockwise项的话默认为顺时针ctx.arc(350, 300, 150, 0, [(Math.PI) / 180] * 360) // 如果此处改为使用fill()方法,那么将会绘制出填充的圆ctx.stroke() ctx.closePath()const canvas2 = document.getElementById('canvas2')const ctx2 = canvas2.getContext('2d')// 画一个圆弧ctx2.beginPath();ctx2.arc(350, 300, 150, 0, [(Math.PI) / 180] * 300, true) // (Math.PI) / 180 = 1°ctx2.stroke() ctx2.closePath()// 画圆弧的第二种方式// 定义线段的起点ctx2.beginPath();ctx2.moveTo(200, 300)// 切线交点坐标为(400,100),结束点为(400,500)ctx2.arcTo(400, 100, 400, 500, 100) ctx2.lineWidth = 2ctx2.stroke()ctx2.closePath()	
</script>

画椭圆也用对应的api即可

<canvas id="canvas" height="600" width="700"></canvas>
<script>const cnv = document.getElementById('canvas')const ctx = cnv.getContext('2d')ctx.ellipse(350, 300, 100, 200, [(Math.PI) / 180] * 60, [(Math.PI) / 180] * 0, [(Math.PI) / 180] * 360, false)ctx.fillStyle = 'skyblue'ctx.fill()
</script>

canvas绘制文本

<canvas id="canvas" height="600" width="700"></canvas>
<script>const canvas = document.getElementById('canvas')const ctx = canvas.getContext('2d')ctx.beginPath()ctx.font = '50px Verdana';// strokeText(Text,left,top,[maxlength])ctx.strokeText('Hello Canvas!', 180, 320, 400)ctx.closePath()ctx.beginPath()ctx.font = '50px Verdana'// strokeText(Text,left,top,[maxlength])ctx.fillText('Hello Canvas!', 180, 420, 400)ctx.closePath()// 设置文本样式// .font方法可以设置文本大小和字体;// .textAlign:设置文本的对齐方式,可选left/right/center/start/end// textBaseline:决定了文本在垂直方向的对齐方式,可选alphabetic/top/hanging/middle/ideographic/bottom// .direction:设置文本的绘制方向,可选ltr(left to right)和rtl(right to left)// 右对齐文本:ctx.beginPath()ctx.font = '40px serif'ctx.textAlign = 'right'ctx.direction = 'ltr'ctx.strokeText('Hello Canvas!11', 350, 250, 400)ctx.beginPath()</script>

canvas绘制图片

<canvas id="canvas" height="600" width="700"></canvas>
<script>var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');// 创建一个图片对象:var img = new Image();img.src = 'http://panpan.dapanna.cn//image-20221009113426344.png';// 图片加载完成之后绘制图片:img.onload = function () {ctx.drawImage(img, 0, 0); // 在(0,0)处绘制原图}
</script>

相关文章:

canvas 入门

canvas 入门 canvas是干什么的&#xff1f;canvas 绘制直线canvas画虚线canvas 绘制三角形canvas 绘制正方形canvas 绘制圆形、圆弧与椭圆canvas绘制文本canvas绘制图片 canvas是干什么的&#xff1f; <canvas> 是HTML5中的标签&#xff0c;它是一个容器&#xff0c;可以…...

建议收藏!混迹职场多年总结出的8大技巧!

1. 不要吃“哑巴”亏&#xff1a;不管在什么企业&#xff0c;一定要“会说话”&#xff0c;敢于表达自己&#xff0c;但是又兼顾身边人的感受&#xff0c;考虑好自己的言行将会带来的后果。良好的沟通技巧对于在职场中建立良好的人际关系和解决问题至关重要。学会倾听、表达和理…...

OpenCV4(C++)—— 视频和摄像头的加载、显示与保存

文章目录 一、加载与显示二、保存 一、加载与显示 视频或摄像头的加载是使用 cv::VideoCapture 类。&#xff08;这个类和 ifstream 类比较相似&#xff0c;视频或摄像头的加载和文本文件操作是大致相同。主要步骤&#xff1a;&#xff08;1&#xff09;加载&#xff08;打开&a…...

excel功能区(ribbonx)编程笔记6-box的使用

box元素用来在组里指定的控件周围放置一个可视的框,其主要目的是将控件作为一个单元组合在一起。 通常情况下,分配到组中的每个控件都被放置在先前的控件下面直到该列被填满,然后下一个控件被放置在其右侧列的顶行。然而,通过在框里面组合命令,可以将几个控件视作一个整体…...

oralce配置访问白名单的方法

目录 配置sqlnet.ora文件 重新加载使配置生效 注意事项 Oracle数据库安全性提升&#xff1a;IP白名单的配置方法 随着互联网的发展&#xff0c;数据库安全问题也越来越严重。Oracle是目前使用较为广泛的一款数据库管理系统&#xff0c;而IP白名单作为提升数据库安全性的有效…...

ToBeWritten之让响应团队参与并做好沟通

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

ffmpeg ts 关于av_seek_frame

1 ffmpeg命令行 一般对视频文件的裁剪 我们通过一行 ffmpeg命令行即可实现&#xff0c;比如 ffmpeg -ss 0.5 - t 3 - i a.mp4 vcodec copy b.mp4 其中 -ss 放置较前 开启精准seek定位 对于mp4而言 seek将从moov中相关索引表查找 0.5s时刻附近最近的关键帧 &#xff08;此描述…...

【C++】set map 的底层封装

在了解底层封装之前除了对set和map的使用情况要有一定了解&#xff0c;还需要先学习一下二叉搜索树&#xff0c;AVL树&#xff0c;红黑树这些数据结构。 【C】二叉搜索树 【C】AVL树 & 红黑树 RBTree.h enum Colour {RED,BLACK };template<class T> class RBTreeNo…...

JavaWeb整体介绍

JavaWeb整体介绍 什么是Java Web Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;www&#xff09;&#xff0c;能够通过浏览器访问的网站JavaWeb&#xff1a;是使用Java技术解决相关web互联网领域的技术栈&#xff08;就是用java开发网站&#xff09; 网页&a…...

一些常见分布-正态分布、对数正态分布、伽马分布、卡方分布、t分布、F分布等

目录 正态分布 对数正态分布 伽马分布 伽马函数 贝塔函数 伽马分布 卡方分布 F分布 t分布 附录 参考文献 本文主要介绍一些常见的分布&#xff0c;包括正态分布、对数正态分布、伽马分布、卡方分布、F分布、t分布。给出了分布的定义&#xff0c;推导了概率密度函数&…...

科技云报道:押注向量数据库,为时过早?

科技云报道原创。 在大模型的高调火热之下&#xff0c;向量数据库也获得了前所未有的关注。 近两个月内&#xff0c;向量数据库迎来融资潮&#xff0c;Qdrant、Chroma、Weaviate先后获得融资&#xff0c;Pinecone宣布1亿美元B轮融资&#xff0c;估值达到7.5亿美元。 东北证券…...

铭控传感亮相2023国际物联网展,聚焦“多场景物联感知方案”应用

金秋九月&#xff0c;聚焦IoT基石技术&#xff0c;荟萃最全物联感知企业&#xff0c;齐聚IOTE 2023第20届国际物联网展深圳站。铭控传感携智慧楼宇&#xff0c;数字工厂&#xff0c;智慧消防&#xff0c;智慧泵房等多场景物联感知方案及多品类无线传感器闪亮登场&#xff0c;现…...

前端demo: 实现对图片进行上传前的压缩功能

前端可以使用canvas和File API来对图片进行压缩和缩放处理&#xff0c;以下是一个示例代码 : 压缩方法compressImg这段代码是实现对图片进行上传前的压缩功能 1. 定义了一个压缩图片的函数 compressImg&#xff0c;接受两个参数&#xff1a;file表示要压缩的文件&#xff0c;q…...

计算机网络(文章链接汇总)

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 计算机网络&#xff08;一&#xff09;&#xff1a;概述计算机网络&#xff08;二&#xff09;&#xff1a;物理层计算机网络&#xff08;三&#xff09;&#xff1a;数据链路层计算机网…...

黑科技-Android

1热更新&#xff08;热修复&#xff09;&#xff1a;apk不用发版&#xff0c;就能修复bug 原理&#xff1a;我们修复好了bug的时候&#xff0c;把那些有改动的java源码编译成class&#xff0c;再打包成dex&#xff0c;然后通过反射技术放到dexElements数组的最前面&#xff0c;…...

450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xff1a; 首先…...

python安全工具开发基础

文章目录 拷贝、with、is深拷贝、浅拷贝with 三器一闭迭代器生成器闭包装饰器 动态绑定垃圾回收网络编程UdpTcp 协程mysql预处理防止注入 redis未授权/弱密码 拷贝、with 、is a [11, 22, 33] b [11, 22, 33] ca print(id(a)) print(id(b)) print(id(c))print(a b) print(…...

26 docker前后端部署

[参考博客]((257条消息) DockerNginx部署前后端分离项目(SpringBootVue)的详细教程_在docker中安装nginx实现前后端分离_这里是杨杨吖的博客-CSDN博客) (DockerNginx部署前后端分离项目(SpringBootVue)) 安装docker # 1、yum 包更新到最新 yum update # 2、安装需要的软件包…...

[linux] SFTP文件传输基本命令 --- xshell 直接上传文件

2.sftp - 上传文件&#xff1a;如果上传/下载的是文件夹, 在put/get命令后加上-r参数即可。 上传文件&#xff1a; 把本地服务器的/www/wwwroot目录下面的study.log文件上传到远程服务器的/www/server目录下。 sftp> lcd /www/wwwroot sftp> put study.log /www/server…...

Tomcat 多实例

一、Tomcat 多实例 1、概念&#xff1a; Tomcat 多实例是指在同一台服务器上运行多个独立的 Tomcat 服务器实例。它们可以同时运行在同一台物理服务器或虚拟服务器上&#xff0c;但它们彼此之间是相互独立的&#xff0c;有各自的配置、应用程序和资源。 2、配置&#xff1a;…...

PET/SPECT医疗影像设备液冷系统核心技术解析

1. PET/SPECT扫描仪的热管理挑战在医疗影像设备领域&#xff0c;正电子发射断层扫描&#xff08;PET&#xff09;和单光子发射计算机断层扫描&#xff08;SPECT&#xff09;作为核医学成像的两种核心技术&#xff0c;其运行过程中产生的热量管理一直是工程设计的核心难题。这类…...

从德雷科风暴看关键通信网络备用电源失效与韧性加固策略

1. 从一场风暴看关键通信网络的脆弱性2012年6月底&#xff0c;一场被称为“德雷科”的强对流风暴席卷了美国中西部&#xff0c;其影响一直延伸到东海岸。这场风暴带来的不仅仅是狂风和暴雨&#xff0c;更是一次对现代基础设施&#xff0c;特别是关键通信网络的极端压力测试。风…...

AI 术语通俗词典:Logistic 函数

Logistic 函数是数学、统计学、机器学习和人工智能中非常常见的一个术语。它用来描述一种把任意实数平滑映射到 0 和 1 之间的 S 形函数。换句话说&#xff0c;Logistic 函数是在回答&#xff1a;如果一个输入值可以从负无穷到正无穷变化&#xff0c;怎样把它转换成一个具有概率…...

DDR内存信号测试难题:芯片中介层原理与实战部署指南

1. 项目概述&#xff1a;当PCB上的DDR内存引脚“无处下针”时作为一名在硬件测试和信号完整性领域摸爬滚打了十几年的工程师&#xff0c;我太熟悉那种场景了&#xff1a;测试工程师拿着示波器探头&#xff0c;对着电路板上密密麻麻的元器件&#xff0c;尤其是那些藏在其他芯片底…...

企业级Angular微前端架构中,Claude如何安全介入模块拆分与契约校验(含TS类型推导审计日志)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;企业级Angular微前端架构中Claude介入的边界与安全基线 在企业级 Angular 微前端系统中&#xff0c;将 Claude 类大语言模型&#xff08;LLM&#xff09;作为辅助开发工具引入时&#xff0c;必须严格界…...

Windows安卓应用安装器:终极免费方案,3分钟搞定电脑运行安卓应用!

Windows安卓应用安装器&#xff1a;终极免费方案&#xff0c;3分钟搞定电脑运行安卓应用&#xff01; 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过…...

从单片机寄存器到多线程标志:volatile关键字的5个硬核使用场景详解

从单片机寄存器到多线程标志&#xff1a;volatile关键字的5个硬核使用场景详解 在嵌入式系统和并发编程的世界里&#xff0c;volatile关键字就像一位沉默的守护者&#xff0c;确保编译器不会自作聪明地优化掉那些看似冗余但实际上至关重要的代码。对于习惯了高层抽象语言的开发…...

对比按需调用与Token Plan套餐的实际支出感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比按需调用与Token Plan套餐的实际支出感受 对于个人开发者或小型团队而言&#xff0c;在大模型API的日常使用中&#xff0c;成本…...

2026年搜索引擎大变革:生成式优化解决方案引领新潮流

引言随着ChatGPT、Google AI概览等工具成为主流搜索界面&#xff0c;传统的SEO策略已难以适配新时代的挑战。生成式引擎优化&#xff08;GEO&#xff09;应运而生&#xff0c;成为企业在线上生存与优化的新选择。本文将探讨2026年SEO行业格局的变化&#xff0c;分析GEO的核心逻…...

引用格式错乱导致学术不端?Perplexity官方未公开的4种强制校准法,仅限内部研究员使用!

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity引用格式设置教程 Perplexity 本身不提供原生的参考文献管理功能&#xff0c;但其生成的回答可导出为 Markdown 或纯文本&#xff0c;便于后续在学术写作中按标准格式&#xff08;如 APA、ML…...