首页 > 其他分享 >canvas基础2

canvas基础2

时间:2023-04-07 13:33:44浏览次数:34  
标签:canvas 基础 getContext let context 100 绘制 drawing

canvas基础2

一、绘制路径

// 2d 绘图上下文支持很多在画布上绘制路径的方法。
// 通过路径可以创建复杂的形状和线条。

let drawing = document.getElementById("drawing");
         
// 确保完全支持<canvas>
if (drawing.getContext) {
  let context = drawing.getContext("2d");
  
  // 启动路径
  context.beginPath();
         
  // 绘制外圆
  context.arc(100, 100, 99, 0, 2 * Math.PI, false);
  
  // 绘制内圆
  context.moveTo(194, 100);
  context.arc(100, 100, 94, 0, 2 * Math.PI, false);
  
  // 绘制分针
  context.moveTo(100, 100);
  context.lineTo(100, 15);
  
  // 绘制时针
  context.moveTo(100, 100);
  context.lineTo(35, 100);
  
  // 描画路径
  context.stroke();
}

// 浏览器输出如下

绘制路径 canvas01.png

二、绘制文本

// 文本和图像混合也是常见的绘制需求,因此 2d 绘图上下文还提供了绘制文本的方法,即 fillText() 和 strokeText()。

// 下面的例子会在前一节示例的表盘顶部绘制数字“12”:

  context.font = "bold 14px Arial";
  context.textAlign = "center";
  context.textBaseline = "middle";
  context.fillText("12", 100, 20);

绘制文本 canvas02.png

// 如果textAlign是“start”,那么 x 坐标在从左到右书写的语言中表示文本的左侧坐标,
// 而“end”会让 x 坐标在从左到右书写的语言中表示文本的右侧坐标。

// 正常
context.font = "bold 14px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillText("12", 100, 20);
// 与开头对齐
context.textAlign = "start";
context.fillText("12", 100, 40);
// 与末尾对齐
context.textAlign = "end";
context.fillText("12", 100, 60);

绘制文本3 canvas03.png

// measureText() 方法使用font、textAlign 和 textBaseline 属性当前的值计算绘制指定文本后的大小。


let drawing = document.getElementById("drawing");
         
// 确保完全支持<canvas>
if (drawing.getContext) {
  let context = drawing.getContext("2d");
  
  let fontSize = 100;
  context.font = fontSize + "px Arial";
  while(context.measureText("Hello world!123aaaaa").width > 140) {
    fontSize--;
    context.font = fontSize + "px Arial";
  }
  context.fillText("Hello world!123aaaaa", 10, 10);
  context.fillText("Font size is " + fontSize + "px", 10, 50); 
}

绘制文本3 canvas04.png

三、变换

// 上下文变换可以操作绘制在画布上的图像。2d 绘图上下文支持所有常见的绘制变换。

// 变换可以简单,也可以复杂。

// 例如,在前面绘制表盘的例子中,如果把坐标原点移动到表盘中心,那再绘制表针就非常简单了:


let drawing = document.getElementById("drawing");
         
// 确保完全支持<canvas>
if (drawing.getContext) {
  let context = drawing.getContext("2d");
  
  // 启动路径
  context.beginPath();
         
  // 绘制外圆
  context.arc(100, 100, 99, 0, 2 * Math.PI, false);
  
  // 绘制内圆
  context.moveTo(194, 100);
  context.arc(100, 100, 94, 0, 2 * Math.PI, false);
    
  // 移动原点到表盘中心
  context.translate(100, 100);
  
  // 绘制分针
  context.moveTo(0, 0);
  context.lineTo(0, -85);
  
  // 绘制时针
  context.moveTo(0, 0);
  context.lineTo(-65, 0);
  
  // 描画路径
  context.stroke();
}

// 浏览器输出如下

变换 canvas01.png

// 当然,也可以使用rotate()方法来转动表针:

//旋转表针
context.rotate(1);



let drawing = document.getElementById("drawing");
         
// 确保完全支持<canvas>
if (drawing.getContext) {
  let context = drawing.getContext("2d");
  
  // 启动路径
  context.beginPath();
         
  // 绘制外圆
  context.arc(100, 100, 99, 0, 2 * Math.PI, false);
  
  // 绘制内圆
  context.moveTo(194, 100);
  context.arc(100, 100, 94, 0, 2 * Math.PI, false);
    
  // 移动原点到表盘中心
  context.translate(100, 100);
    
  //旋转表针
  context.rotate(1);
  
  // 绘制分针
  context.moveTo(0, 0);
  context.lineTo(0, -85);
  
  // 绘制时针
  context.moveTo(0, 0);
  context.lineTo(-65, 0);
  
  // 描画路径
  context.stroke();
}

// 浏览器输出如下

变换2 canvas05.png

// 如果想着什么时候回到当前的属性和变换状态,可以调用 save() 方法。

// 调用这个方法后,所有这一时刻的设置会被放到一个暂存栈中。

let drawing = document.getElementById("drawing");
         
// 确保完全支持<canvas>
if (drawing.getContext) {
  let context = drawing.getContext("2d");
  
  context.fillStyle = "#ff0000";
  context.save();
           
  context.fillStyle = "#00ff00";
  context.translate(100, 100);
  context.save();
           
  context.fillStyle = "#0000ff";
  context.fillRect(0, 0, 100, 200);   // 在(100,100)处绘制蓝色矩形
           
  context.restore();
  context.fillRect(10, 10, 100, 200);   // 在(110,110)处绘制绿色矩形
           
  context.restore();
  context.fillRect(0, 0, 100, 200);  // 在(0,0)处绘制红色矩形

}


// 浏览器输出如下

变换3 canvas06.png

标签:canvas,基础,getContext,let,context,100,绘制,drawing
From: https://blog.51cto.com/u_14483476/6176023

相关文章

  • 【Spring AOP基础使用:认识AOP,AOP作用,核心概念,AOP实现】
    本文纲要一、了解AOP1、认识AOP2、AOP作用3、AOP核心概念二、AOP快速入门1、基础准备2、AOP实现3、总结三、AOP获取通知数据1、JoinPoint2、ProceedingJoinPoint3、获取通知数据的使用场景进入正文:一、了解AOP1、认识AOPAOP(AspectOrientedProgramming)面向切面编程,一种......
  • JAVA 的绘图技术(基础)
         ......
  • Redis-基础(逐步完善)
    Redis持久化RDB/AOF命令RDB(dump.rdb文件)适用于大规模数据恢复,且对数据完整性和一致性不高的情况把当前进程数据生成快照保存到硬盘的过程RDB文件的处理保存位置:dbfilename压缩:rdbcompression,默认开启LZF压缩,会消耗CPU校验:rdbchecksum,使用CRC64算法校验RDB持久化触发方式......
  • LLaMA:开放和高效的基础语言模型
    LLaMA:开放和高效的基础语言模型论文:https://arxiv.org/pdf/2302.13971.pdf代码:https://github.com/facebookresearch/llama前言我们介绍了LLaMA,这是一个参数范围从7B到65B的基础语言模型集合。我们在数以万亿计的标记上训练我们的模型,并表明有可能完全使用公开可用的数据集来......
  • canvas实现图片镜像翻转的2种方式
    canvas实现图片镜像翻转的2种方式原文引用:https://www.qetool.com/scripts/view/23387.html1.通过canvas自带的画布方法进行翻转varimg=newImage();//这个就是img标签的dom对象img.src='./sy.png';img.onload=function(){//图片加载完成后,执行此方......
  • K8S基础环境部署0
    基础环境部署1)前期准备(所有节点)1、修改主机名和配置hosts先部署1master和2node节点,后面再加一个master节点#在172.17.35.60执行hostnamectlset-hostnamek8s-m60#在172.17.35.62执行hostnamectlset-hostnamek8s-n62#在172.17.35.63执行hostnamectlset-ho......
  • 结构体基础知识
    定义struct变量后,在main函数的调用时//定义时struct不可以省略structsudents1;//这个可以省略s1.name="name";structsudents2={"学生","18"};cout<<s2.name结构体数组在main函数中structStudentstuarray[3]={{"张三",21,34},//stuarray[1]{&qu......
  • geant4基础操作
    geant4官网:Geant4(cern.ch)打开B1实例的方法:进入用户文件夹/geant4_workspace/B1/build右键点击在终端中打开输入cmake..进行编译以及生成配置文件(预编译)再输入make合并编译器生成的目标exampleB1可执行文件输入./exampleB1对可执行文件运行,生成可视化界面配置参数文......
  • 【web 开发基础】PHP 的流程控制之多向条件分支结构 -PHP 快速入门 (14)
    多向条件分支结构(elseif)条件分支结构其实是我们生活中常用的一种一种逻辑结构,类似于我们常用的(如果...那么...否则...就.....).本文中的elseif子句,和此名称暗示的一样,就是if和else的组合,相当于(...else{if(表达式){{语句块;}}})。和else一样,它延伸了if语句,条件分支结构中els......
  • 应急响应基础技能
    windows任务计划列表1.计算机管理窗口,选择系统工具中任务计划程序中的任务计划程序库选项可以查看任务计划的名称,状态,触发器等详细信息2.powershell中输入get-scheduledtask可以查看当前系统所有任务计划信息任务路径,名称,状态等详细信息3.命令行中输入schtasks......