问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Canvas的save()和restore()到底是针对什么存储什么??

发布网友 发布时间:2022-04-30 02:44

我来回答

3个回答

懂视网 时间:2022-04-20 03:07

本篇文章给大家带来的内容是关于HTML5Canvas save如何保存恢复状态,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在绘画的时候,经常会有这种情况,本来正在用绿色笔画,突然需要用红色笔画几笔,但画完了之后又要换成绿色笔。如果是在现实中作画,可以把笔蘸上不同的墨水,画了之后又蘸上之前的墨水,或者准备几只笔,要用哪只就选哪只。

在Canvas中也可以这样,不过Canvas中的画笔永远只有一只。所以,如果要更换画笔的颜色,就需要保存和恢复状态。状态其实就是画布当前属性的一个快照,包括:

图形的属性值,如strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor等。

当前的裁切路径。

当前应用的变换(即平移、旋转和缩放)。

Canvas中,使用save()方法来保存状态,使用restore()方法来恢复状态。Canvas状态是以栈的方式来保存:每次调用save()方法,就会把当前状态压入栈顶保存;每次调用restore()方法,就会把栈顶的状态取出来,并把画布恢复到这个状态,用这个状态绘图。

context.fillStyle = "red";
context.fillRect(10, 10, 180, 180);
context.fill();
context.save();   // ① 栈: "red"
context.fillStyle = "green";
context.fillRect(30, 30,140,140);
context.save();   // ② 栈: "red","green"
context.fillStyle = "blue";
context.fillRect(50, 50, 100,100);
context.restore();  // 恢复到 ② 的状态, 栈: "red","green"
context.beginPath();
context.fillRect(70, 70, 60, 60); // 用栈顶的状态绘图,填充"green"
context.restore();  // 恢复到 ① 的状态, 栈: "red"
context.fillRect(90, 90, 20, 20); // 用栈顶的状态绘图,填充" red "
context.fill();

上述代码中,首先绘制第一个红色的矩形。接着调用第一个save()方法,把第一个红色矩形的状态压栈,此时栈中只有一个元素"red",记为 ①。然后把状态设置为"green",绘制第二个矩形,此时绘制出的是绿色矩形。接着调用第二个save()方法,把第二个绿色矩形的状态压栈,此时栈中有两个元素"red","green",栈顶元素为"green",记为 ②。接着绘制第三个蓝色矩形,此处没有调用save()方法,栈的状态不变。接着调用restore()方法,恢复到 ② 的状态,绘制第四个矩形,此时栈顶元素为"green",故绘制出绿色矩形。接着再调用restore()方法,恢复到 ① 的状态,绘制第五个矩形,此时栈顶元素为"red",故绘制出红色矩形。

save-restore.png

从本例可以看到,通过save-restore组合把代码包裹起来,实质上是把save()方法和restore()方法之间的样式包裹起来,这样一来,它们就不影响后面绘制的图形。

save()方法和restore()方法都可以被调用任意多次,并且可以嵌套。记住,save()方法和restore()方法总是成对出现,每次调用restore()方法,都是恢复到最近一次调用save()方法时栈的状态,并用该栈顶所保存的状态进行绘制。

热心网友 时间:2022-04-20 00:15

save()save的是canvas的属性,不是当前画面的截图。
restore()就是把上一次save读出来,方便你可以不用再次设置canvas的画笔颜色粗细等

热心网友 时间:2022-04-20 01:33

save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何批量导出全部微信好友微信号?快速导出微信联系人 交强险什么价格 命运冠位指定必练五星英灵是什么 命运冠位指定必练五星英灵推荐 自制豆沙馅能保存多久 红豆沙馅怎么保存 我高三,从现在到高考分数从350提到500多,有可能吗?我是文科生 高三350分还有5个月能提多少分 文科复读350多分可以提高多少 钱钟书-谈艺录-读本目录 送茶叶都有什么讲究呢? 中国文化送礼茶叶有什么讲究茶叶送礼有什么讲究和注意事项 麻辣烫加盟店哪个比较好 canvas.save和restore方法是什么回事 WPF Canvas.Clip裁切出来的形状如何随着容器拉伸缩放! android Canvas 裁剪clipPath的时候怎么过滤锯齿 开麻辣烫店需要什么手续? 水晶水饺的皮儿是怎么做的? 第一次开麻辣烫加盟店,都需要注意什么? 开个麻辣烫加盟店需要哪些证件? 英语完形填空解题技巧方法快速提高 英语完形填空解题技巧和方法是什么? 英语完形填空解题技巧方法是什么? 包饺子用的面皮,面皮的单词 在什么场景下,你会选用mysql做为数据库,什么场景下,会选用oracle做为数据库?为什么? 龙利鱼和扒皮鱼一样吗 这是什么鱼?我买的时候说是扒皮鱼,但是买回来发现有点鳞片?扒皮鱼好像没有鳞片吧,价格也不贵17元两 请大家告诉我这是什么鱼 扒皮鱼的学名叫什么 jquery怎么在一个页面关闭时判断这个页面中是否有打开的layer弹出框 丁香鱼和扒皮鱼有什么区别 什么是皮鱼? HTML5的canvas绘图和CSS3的绘图哪个更有优越性? Android Drawable,Bitmap,Canvas和Paint的区别 android 自定义view 怎么裁剪画布 请问大家,full canvased,half canvased,和 half fused是什么意思啊? 各位大虾 我想知道既然数据库的用途就是一般的存储 查询 那EXCEL也可以实现 为什么要用ORACLE什么的? 您好惠普m126a突然不能打印了,也不能复印了,打印机和电脑都重启了,仍无反应? HP LaserJet Pro M126a打印机共享之后不能打印怎么办? 您好,惠普M126a无法打印是怎么回事?重启了,然后驱动也正常只能复印不能打印 hp m126a在台式机上无法打印处理办法 惠普hpm126a打印机驱动安装完无法打印怎么处理 M126a突然只能复印跟扫描,不能打印,按确定后无反应,也没有任何打印进程。 明日方舟中文配音怎么设置 手机版方舟进化生存怎么调中文 nitrado IOS怎么调中文 小米8玩方舟怎么设置为中文? 末日方舟要怎么才能设置中文语言? 三维激光扫描仪和雷达什么关系啊?? 求助高手,激光雷达和三维激光扫描仪是同一个东西么?麻烦告诉我 求高手指点:三维激光扫描仪和激光雷达是不是同一类型设备? 3D激光扫描仪的原理是什么?