Canvas--》使用Canvas完成基本绘图

canvas 详解 —— 绘制篇 阅读详情

 

🌟Canvas介绍

<canvas>是一个可以使用脚本 (通常为javaScript) 来绘制图形的HTML元素。例如,它可以用于绘制图表、制作图片构图或者制作简单的动画。如上面效果示例就是使用 <canvas> 来实现示例,后续将一步步实现上面效果。

Canvas 的默认大小为 300 像素 ×150 像素(宽 × 高,像素的单位是 px)。但是,可以使用 HTML 的高度和宽度属性来自定义 Canvas 的尺寸。为了在 Canvas 上绘制图形,我们使用一个 JavaScript 上下文对象,它能动态创建图像(creates graphics on the fly)。

🌟Canvas 的基本用法

获取绘制上下文

// cvs为canvas元素
const ctx = cvs.getContext("2d");
// 之后使用上下文对象ctx完成后续绘图
  • 所有的绘图都必须在上下文中完成
  • 同一个canvas元素只能产生唯一的上下文
  • 上下文类型可以是:
    • 2d:绘制2d图形
    • bitmaprenderer:绘制位图上下文
    • webgl:绘制3d的上下文,只在实现WebGL版本 1(OpenGL ES 2.0) 的浏览器上可用
    • webgl2:绘制3d的上下文,只在实现 WebGL 版本 2 (OpenGL ES 3.0) 的浏览器上可用

Context2D绘图

cvs.getContext('2d')

会产生一个CanvasRenderingContext2D对象,它里面包含非常多的绘图方法。

利用这些绘图方法,我们可以完成下列图形的绘制:

  1. 直线

  2. 曲线

  3. 文字

  4. 图片

利用上面基本形状以及它们的组合,再配合它提供的各种样式设置,就可以完成任意二维图像的绘制。

栅格

​

在我们开始画图之前,我们需要了解一下画布栅格(canvas grid)以及坐标空间。如上图所示,canvas 元素默认被网格所覆盖。通常来说网格中的一个单元相当于 canvas 元素中的一像素。栅格的起点为左上角(坐标为(0,0))。所有元素的位置都相对于原点定位。所以图中蓝色方形左上角的坐标为距离左边(X 轴)x 像素,距离上边(Y 轴)y 像素(坐标为(x,y))。

绘制路径

图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。使用路径绘制图形需要一些额外的步骤。

  1. 首先,你需要创建路径起始点。
  2. 然后你使用画图去画出路径。
  3. 之后你把路径封闭。
  4. 一旦路径生成,你就能通过描边或填充路径区域来渲染图形。

以下是所要用到的函数:

beginPath()

新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。

closePath()

闭合路径之后图形绘制命令又重新指向到上下文中。

stroke()

通过线条来绘制图形轮廓。

fill()

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

生成路径的第一步叫做 beginPath()。本质上,路径是由很多子路径构成,这些子路径都是在一个列表中,所有的子路径(线、弧形、等等)构成图形。而每次这个方法调用之后,列表清空重置,然后我们就可以重新绘制新的图形。

🌟开始画图

绘制基础线条及圆点

接下来就可以开始画图,首先来实现线条:

​

可以得到如下:

​

接下来使用arc()方法在线条两端绘制圆形 :

​

 效果如下:

​

封装方法

在随机位置生成圆

​

 多点连线

​

 🌟完整代码

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width= , initial-scale=1.0" />
    <title>Document</title>
    <style>
      canvas {
        position: fixed;
        left: 0;
        top: 0;
        background: #222;
      }
    </style>
  </head>
  <body>
    <canvas></canvas>
    <script src="./index.js"></script>
  </body>
</html>

JS

const cvs = document.querySelector('canvas');
const ctx = cvs.getContext('2d');

function init() {
  cvs.width = window.innerWidth;
  cvs.height = window.innerHeight;
}

init();

/**
 * 获取 [min, max] 范围内的随机整数
 * @return {Number}
 */
function getRandom(min, max) {
  return Math.floor(Math.random() * (max + 1 - min) + min);
}

class Point {
  constructor() {
    this.r = 6;
    this.x = getRandom(0, cvs.width - this.r / 2);
    this.y = getRandom(0, cvs.height - this.r / 2);
  }

  draw() {
    ctx.beginPath();
    ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI);
    ctx.fillStyle = 'rgb(200,200,200)';
    ctx.fill();
  }
}

class Graph {
  constructor(pointNumber = 30, maxDis = 200) {
    this.points = new Array(pointNumber).fill(0).map(() => new Point());
    this.maxDis = maxDis;
  }

  draw() {
    for (let i = 0; i < this.points.length; i++) {
      const p1 = this.points[i];
      p1.draw();
      for (let j = i + 1; j < this.points.length; j++) {
        const p2 = this.points[j];
        const d = Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2);
        if (d > this.maxDis) {
          continue;
        }
        ctx.beginPath();
        ctx.moveTo(p1.x, p1.y);
        ctx.lineTo(p2.x, p2.y);
        ctx.closePath();
        ctx.strokeStyle = `rgba(200,200,200,${1 - d / this.maxDis})`;
        ctx.stroke();
      }
    }
  }
}

const g = new Graph();
g.draw();

🌟写在最后

Canvas--》将详细讲解关于绘制图表、制作图片构图或者制作简单的动画,如果文中出现有瑕疵的地方各位通过评论或者私信联系我,我们一起进步,有兴趣的伙伴可以关注订阅一下:点击查看更多实用技巧及技术

canvas绘制图片的三种方法(图文示例) 如何使用canvas来绘制图片呢?这里有三种方法。 语法: drawImage(image, dx, dy) drawImage(image, dx, dy, dWidth, dHeight) drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 阅读详情

相关推荐

canvas详解01-绘制基本图形

既然我们已经设置了 canvas 环境,我们可以深入了解如何在 canvas 上绘制。到本文的最后,你将学会如何绘制矩形,三角形,直线,圆弧和曲线,变得熟悉这些基本的形状。绘制物体到 Canvas 前,需掌握路径,我们看看到底怎么做。

大雾起了清晨 4128

canvas 绘制图片

前面我们了解了canvas的一些基本使用方法,在canvas中我们还可以在canvas中直接绘制图片,在canvas中绘制图片主要使用到drawImage方法 一:drawImage方法参数有三中情况 1:三个参数 ctx.drawImage(image,dx,dy) image:需要绘制的img图片 dx,dy:绘制的img图片在canvas中的坐标(x,y) 2:五个参数 c...

huaweichenai的博客 9720

掌握HTML5 Canvas绘图艺术:性能、形状与图像处理

本文深入探讨了HTML5 Canvas API的高级使用技巧,包括性能优化、绘制基本形状、文本以及图像的方法。我们了解到在调用stroke函数之前更改线条属性是没有用的,因为它可能导致性能下降。同时,介绍了绘制矩形、圆形的简便方法,以及如何通过调整参数来绘制不同大小和位置的形状。此外,本文还探讨了在Canvas上绘制文本和应用CSS样式的方法,以及如何使用变换函数来平移、缩放和旋转Canvas上下文。最后,文章详细说明了如何在Canvas上绘制和操作图像,包括像素级别的图像处理。

weixin_36204513的博客 444

Canvas绘制图片的三种方法

本文将深入探讨三种常见的使用 Canvas 绘制图像的方法,并通过详细的示例代码来展示每种方法的特点和用途。每种方法都有其特定的应用场景,而选择最合适的方法取决于具体的需求。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。通过阅读以上资源,你可以更深入地了解 Canvas 和相关技术的使用方法,以及如何解决实际开发中遇到的问题。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,专栏系列(点击解锁)

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 2673

Arduino MLX90393磁力计驱动库:高精度三轴霍尔传感器开发指南

三轴霍尔效应磁力计是嵌入式系统中实现无接触角度检测、电子罗盘与电流传感的核心器件。其工作原理基于霍尔电压随外磁场矢量变化的物理特性,通过I²C接口输出高分辨率(16/20-bit)XYZ轴原始数据,并集成温度补偿与数字滤波功能。技术价值体现在确定性响应、低功耗(典型0.5 μA待机)及强抗干扰能力,适用于电池供电设备与实时操作系统环境。典型应用场景包括电机位置反馈、永磁体旋转角度解算、工业编码器和地磁导航。本库专为Arduino生态优化,深度封装MLX90393寄存器协议与自校准流程,同时兼容STM32、E

weixin_29363791的博客 642

codemirror6 制作markdown编辑器(源码模式)

总体上感觉能用,但是不怎么友好,官方文档有点散乱,而且关键字高亮功能是独立出去的,去官方文档找半天,也没找到怎么改。EditorView.theme可以往EditorView模块中修改CSS的样式,从而影响编辑器的样式展示。"### 测试\n\n```javascript\nlet x = 'y'\n```"这个插件中的markdown语法的高亮样式。//这里指定markdown中代码块使用的解析扩展。开头的class样式,并且还需要在选择器前面添加。//markdown语言解析扩展。

qq_43203949的博客 1783

canvas基本语法及实例

canvas &lt; canvas&gt;标签其实就相当于一个容器,一个可以展示绘图内容的画板。我们需要通过 js 脚本往里面绘制图形。Canvas 只能展示绘图的内容, 但是不能进行绘图。最早是 苹果公司 提出的该标签。(游戏 、可视化数据(图表)、banner 广告) 1) 使用 canvas 标签, 即可在页面中开辟一格区域. 可以设置其 width 和 height 设置该区域的尺寸...

zhangxiang_1102的博客 1110

ZYNQ软件复位重启、程序跳转的实现方法(Multiboot)

目录一、增加FSBL的调试信息 一、增加FSBL的调试信息 启动过程的调试信息如下: Xilinx First Stage Boot Loader Release 2016.4 Jan 19 2020-10:35:00 Devcfg driver initialized Silicon Version 3.1 Boot mode is QSPI Single Flash Informat...

weixin_41922484的博客 2万+

canvas--操作步骤--属性

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>01canvas入门</title> </head> <body> <canvas id='demo' width...

weixin_30371875的博客 153

Python自动化生成HyperMesh Tcl命令流:从几何建模到有限元分析

本文详细介绍了如何利用Python自动化生成HyperMesh的Tcl命令流,实现从几何建模到有限元分析的全流程二次开发。通过封装常用操作函数,工程师可以高效完成参数化建模、自动网格划分及求解器文件输出,显著提升CAE前处理效率与标准化水平。

weixin_29041767的博客 423

MATLABGUI读取文件并将路径显示在文本框中

MATLABGUI读取文件并将路径显示在文本框中

m0_50305149的博客 2650

canvas-基本文档

学习canvas,作为基本的文档:<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="js/modernizr.js" type="text/javascript" charset="utf-8"></script>

TonyCreativeStudio 1184

SAP 关于WPS上传文件提示“文档中不包含数据“ 和“程序正在运行中“处理办法

最近这一周经常有用户反馈,使用WPS上传文件系统报错,一直提示“程序正在运行中”,另外在导入数据的时候提示"文档中不包含数据",跟进运维过程中遇到的这两种情况,分享一下处理的办法,如果各位更好的办法也可以给我留言分享。

我小时候很黑的博客 2848

html5 canvas 画板 demo,html5 canvas 简单画板实现代码

canvas简单画板#can{ width:600px; height:500px; border:1px solid #ccc; margin-top:0px; margin-left:20px;}canvas简单画板function getbodyoffsettop(el){var top = 0;do{top = top + el.offsettop;}while(el = el.offse...

weixin_36215894的博客 275

【STM32 CubeMX】I2C中断方式与DMA方式

在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需求和性能要求来选择合适的方式。STM32 CubeMX提供了图形化配置工具,使得配置I2C通信方式变得更加便捷。

m0_62599305的博客 7744

Qt —— 百度离线地图 - 加载百度离线地图、及地图上绘图(附:源码)

Qt —— 加载百度离线地图、及简单绘图(附源码)

1063

使用HTML5的canvas做一个会动的时钟

HTML5支持canvas了,我们可以直接在页面上绘图了,我看了下canvas和GDI+的接口差不多,所以我们先了解些基本的概念和方式,然后来做一个应用吧。 我们做所有的画之情需要一个画布,html的canvas标签就是帮...

chenqunan3231的博客 257

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android中new Canvas(Bitmap)引发的对Canvas和Bitmap关系的疑问

在Android关于Canvas的API描述中,一开始就如下描述:To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect...

空名先生 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

用html5的canvas生成图片并保存到后台

借鉴了 这位大神的 http://blog.youkuaiyun.com/jcx5083761/article/details/7991558

SaYa_of1的博客 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

js+面向对象+html5+canvas相关笔记(一)

1.Canvas是Html5提供的一个展示绘图效果的标签<canvas></canvas>◆使用canvas标签,即可在页面中开辟一个区域,可以设置width和height来设置该区域的尺寸◆默认canvas的宽高为300和150◆不要使用css的方式设置宽高,应该使用html属性◆如果浏览器不支持canvas标签,那么就会将其解...

badongqing5553的博客 124

《Openlayers零基础教程》第十五课:Canvas绘制矩形

本章节讲解Canvas如何结合 Openlayer 使用,首先我们讲解Canvas的绘图基础。我们初始化地图的时候可以看见,实际上Openlayer的地图就是用Canvas实现绘制的。

2401_84715637的博客 411

用canvas制作矩形

用canvas制作矩形

weixin_42859796的博客 192

android canvas 使用

Canvas 又称为画布,在游戏开发过程中是一个经常使用的类。下面举一个实例在完成画布的基本功能 代码如下: public class MySurfaceView extends SurfaceView implements Callback, Runnable { //用于控制SurfaceView private SurfaceHolder sfh; //声明一个画笔 ...

fokman 128

canvas api总结

1.beginPath() 2.closePath() 3.moveTo(x,y) 将鼠标移动到这个坐标 4.lineTo(x,y) 经鼠标从当前位置到连接到一个指定的点 5.stroke() 将线绘制到画布上 6.save() 保存当前绘图状态 7.restore() 恢复到原有的绘画状态 8.translate(x,y) 平移 转载于:https://www.c...

weixin_30611509的博客 77

canvas编写画图工具

效果: 代码: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"

xxtz0522的博客 560
上一篇: 项目上线部署--》服务器部署流程(二)安装Nginx、Node.js、MySQL
下一篇: Vue项目中集成TinyMCE富文本编辑器(图片批量上传等)
琢鸣
琢鸣 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄7年 9626粉丝 53原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琢鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值