画布状态不是画上的.它是一组属性,它们定义了用于绘制下一个事物的工具的当前状态.

画布是立即模式的位图.

像MS油漆.一旦它在那里,它在那里,所以没有意义“保存”当前的图像数据,因为这将像保存整个JPEG,每次你改变,每一帧…

…不,你保存的状态是指定你使用什么坐标方向,尺度尺度,颜色等来绘制NEXT东西的状态(以及之后的所有事情,直到你手动更改这些值).

var canvas = document.createElement("canvas"),

easel = canvas.getContext("2d");

easel.fillStyle = "rgb(80, 80, 120)";

easel.strokeStyle = "rgb(120, 120, 200)";

easel.fillRect(x, y, width, height);

easel.strokeRect(x, y, width, height);

easel.save(); // stores ALL current status properties in the stack

easel.rotate(degrees * Math.PI / 180); // radians

easel.scale(scale_X, scale_Y); // any new coordinates/dimensions will now be multiplied by these

easel.translate(new_X, new_Y); // new origin coordinates, based on rotated orientation, multiplied by the scale-factor

easel.fillStyle = "gold";

easel.fillRect(x, y, width, height); // completely new rectangle

// origin is different, and the rotation is different, because you're in a new coordinate space

easel.clearRect(0, 0, width, height); // not even guaranteed to clear the actual canvas, anymore

easel.strokeRect(width/2, height/2, width, height); // still in the new coordinate space, still with the new colour

easel.restore(); // reassign all of the previous status properties

easel.clearRect(0, 0, width, height);

假设你只是堆叠中的一个状态变化,那最后一行,现在你画布的上一个状态已被恢复,应该已经成功地清除了自己(subpixel shenanigans).

所以你可以看到,它与擦除画布非常相似.

事实上,它与擦除它无关.

它与想要绘制的东西有关,并且做基本的概述和清晰的颜色/样式,然后手动写入上面较小细节的颜色,然后手动将所有的样式写回原来的方式,回到对下一个对象的扫描笔画,并在…上

相反,保存将被重用的一般状态,为较小的细节创建一个新状态,并返回到一般状态,而无需对其进行硬编码,每次或写入setter函数以在画布上设置频繁使用的值并重新设置(重新设置缩放/旋转/仿射变换/颜色/字体/线宽/基线对齐/等).

在你的具体例子中,如果你注意了,你会看到唯一的变化就是步骤的价值.

他们为画布设置了一堆值(颜色/字体/等).

然后他们救了.那他们救了什么?

你看起来不够深他们实际上保存了默认翻译(即:原始世界空间中的origin = 0,0).

但你没有看到他们定义它?

这是因为它被定义为默认值.

他们然后增加步骤1像素(实际上,他们这样做首先,但在第一个循环之后并不重要 – 留在我这里).

然后他们设置一个新的原点为0,0(即:从现在起,当它们键入0,0时,新的起点将指向画布上完全不同的位置).

该原点等于x是画布的正中间,y等于当前步骤(即:像素1或像素2等),为什么从0开始到1之间的差异真的没有没关系).

那么他们做什么呢?

他们恢复

那么他们恢复了什么?

好吧,他们改变了什么?

他们将原点恢复到0,0

为什么?

那么,如果没有,会发生什么?

如果画布是500像素x 200像素,它从0,0开始在我们当前的屏幕空间… …那太棒了…

然后将它们翻译成width / 2,1

好的,现在当他们要求在0,0绘制文字时,他们实际上是在250,1绘制

精彩.但下次会发生什么?

现在他们正在翻译宽/ 2,2

你认为,好吧,这很好… … 0,0的绘图调用将发生在250,2,因为它们将其设置为清除数字:canvas.width / 2,2

不.因为目前的0,0实际上是250,1根据我们的屏幕.一个翻译是相对于其以前的翻译…

所以现在你正在告诉画布从当前坐标’0,0开始,然后离开250,然后向下2.

根据屏幕(这是一个窗口,看地图,而不是地图本身),我们现在是右边的500px,从我们开始的地方下降了3个像素…只有一个帧已经过去了.

因此,在设置新地图之前,将地图的坐标恢复为与屏幕坐标相同的原点(以及旋转相同,以及缩放和偏斜等).

正如你可能会猜到的,现在看来,你可以看到文本应该从上到下移动.不正确的左边,像页面说…

为什么这样做

为什么要改变绘图上下文的坐标系的麻烦,当绘制命令给你一个x和y在那里的功能?

如果你想在画布上画一幅画,你知道它的高低是多大,以及你想要左上角的位置,为什么你不能这么做呢?

easel.drawImage(myImg, x, y, myImg.width, myImg.height);

嗯,你可以

你可以完全这样做没有什么阻止你

事实上,如果你想让它在屏幕上放大,你可以只是更新一个定时器上的x和y,并称之为一天.

但是,如果你画一个游戏角色呢?如果人物有帽子,手套和大靴子,所有这些东西都是从角色中分离出来的呢?

所以首先你会说“好吧,他站在x和y在世界上,所以x加上他的手与他的身体相关的是x body.x – hand.x …或者是那个加号“.

…现在你已经看到所有的部件都看起来像一个充满5年级数学作业的笔记本电脑.

相反,你可以说:“他在这里,设定我的坐标,以便0,0在我的家伙的中间”.现在你的画面调用就像“我的右手在身体右边6像素,左手是左边3像素”一样简单.

当您完成绘制角色时,您可以将原点设置为0,0,然后可以绘制下一个字符.或者,如果你想尝试,你可以从那里翻译成下一个字符的起源,基于从一个到另一个的增量(这将为每个翻译节省一个函数调用).然后,如果你只保存状态一次(原始状态),最后可以通过调用.restore返回到0,0.

html如何清除context,html5 – 在这个例子中Canvas.Context保存和恢复的目的是什么?...相关推荐

  1. php版canvas,PHP实现将HTML5中Canvas图像保存到服务器

    这篇文章主要介绍了PHP实现将HTML5中Canvas图像保存到服务器的方法,可实现将Canvas图像保存到服务器的功能,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了PHP实现将HTML5中 ...

  2. Cocos2dx 3.6.1运行html5的测试例子

    Cocos2dx 3.6.1运行html5的测试例子: 用webStorm运行samples里的js-tests都会报如下错误,可是同样的环境,新建的项目就没有问题. GET http://local ...

  3. html5是什么材料,HTML_HTML5 Canvas标签使用收录, 一、基本概念 什么是Canva - phpStudy...

    HTML5 Canvas标签使用收录 一.基本概念 什么是Canvas 是一个新的 HTML 元素,这个元素在 HTML5  中被定义.这个元素通常可以被用来在 HTML 页面中通过 JavaScri ...

  4. [置顶] HTML5 实现小车动画效果(Canvas/CSS3/JQuery)

    HTML5正在变得越来越流行.在这个移动设备日益增长的时代,对来自Adobe的Flash插件的改造需求也正在快速增长.因为就在最近,Adobe宣布Flash将不再支持移动设备.这意味着,Adobe自身 ...

  5. HTML5 学习手笔二:canvas API 绘制树形图案A

    上篇通过对canvas 画对角线,了解了一些canvas画图基本原理.现在可以利用HTML5 canvas API创建一个场景:带有长跑跑道的树林. 本篇大纲 用canvas API绘制树木的树冠 为 ...

  6. html5学习笔记---03. Canvas简介,Canvas的使用方法

    2013/6/10 03. Canvas简介 a.创梦技术qq交流群:CreDream:251572072 ------------------------- a.Canvas 元素是HTML5的新元 ...

  7. HTML5 实现小车动画效果(Canvas/CSS3/JQuery)

    HTML5正在变得越来越流行.在这个移动设备日益增长的时代,对来自Adobe的Flash插件的改造需求也正在快速增长.因为就在最近,Adobe宣布Flash将不再支持移动设备.这意味着,Adobe自身 ...

  8. html制作小车,HTML5 实现小车动画效果(Canvas/CSS3/JQuery)

    当前位置:编程学习 > html/css >> HTML5 实现小车动画效果(Canvas/CSS3/JQuery) HTML5正在变得越来越流行.在这个移动设备日益增长的时代,对来 ...

  9. Android 中的context, service,active和intent使用详解

    在一个Android应用中,主要是由四种组件组成的,这四种组件分别是Context,Activity,Intent,Service. Content被译为上下文,是应用程序中心,应用程序所有功能可以通 ...

最新文章

  1. 使用core data
  2. 干货:5个维度构建电商全景大数据分析
  3. Verilog功能模块 —— 按键消抖
  4. 【Python基础】python使用PyPDF2和pdfplumber操作pdf
  5. c++ amp vs2017 报错_opencv4教程-1 opencv的安装与调试Windows10+vs2017
  6. vector 不初始化时什么状态_练车时,教练为什么不给你开空调?
  7. DevExpress控件XtraGrid的Master-Detail用法 z
  8. mysql的sum函数 如何设置默认值_mysql使用sum()出现null的问题,各种总结
  9. OpenCV一直下载失败,怎么办?
  10. 腾讯WiFi管家 v3.7.3
  11. layui 借助 parseData 回调函数解析table 组件所规定的数据格式
  12. vlc-for-android
  13. java文件后缀_关于java文件扩展名认识
  14. EPLAN中断点使用方法1
  15. Java设计模式(03) -- 里氏替换原则
  16. JAVA实现无损word转pdf文件完整代码教程
  17. 计算机基础知识(基础入门小白专属)十
  18. SQL注入基础--判断闭合形式
  19. 研发内部控制浅谈(三)(转)
  20. Java毕设项目——人事管理系统(java+SSM+Maven+Mysql+Jsp)

热门文章

  1. 国内浏览器真的好用吗?
  2. 公民信息黑产报价单曝光 网站成泄露隐私重灾区
  3. es6对象数组按指定指定属性数组排序
  4. LOL弗雷尔卓德服务器维护,英雄联盟4月28日维护到几点 部分大区模式维护公告...
  5. 精美漂亮简洁的CSS滚动条样式及代码
  6. 右下角弹窗广告彻底关闭
  7. 使用JLink下载 RT1052 (i.MX RT系列芯片)
  8. CentOS8提高篇15:tar命令详解
  9. access窗体中再制作查询窗体_Excel订单管理系统,窗体录入查询,快捷汇总统算,一键不加班...
  10. 机器学习中的生成模型与判别模型