高清屏下canvas重置尺寸引发的问题的解决


Posted in HTML / CSS onOctober 14, 2019

我们知道,清空canvas画布内容有以下两个方法。

第一种方法是cearRect函数:

context.cearRect(0,0,canvas.width,canvas.height)

第二种方法就是用原值重新设置一下canvas的宽(或者高)

canvas.width = canvas.width
// or 
canvas.height = canvas.height

第二种方法可以起作用,是因为canvas的一个特点:

每当画布的高度或宽度被重设时,画布内容就会被清空。相关内容可以参考 https://www.w3school.com.cn/html5/att_canvas_width.asp

在一个可视化项目中,我们发现在一些电脑上面总是会出现效果错乱的情况。

经过调试,我们发现,原来是“canvas.width = canvas.width”惹的祸。普通屏幕下面下不会有问题,但是如果屏幕是高清屏,就会出现问题。这是因为,高清屏下,我们为了处理绘制图形模糊的问题,通常会做如下处理:

function setupCanvas(canvas) {
        let width = canvas.width,
          height = canvas.height,
          dpr = window.devicePixelRatio || 1.0;
        if (dpr != 1.0 ) {
          canvas.style.width = width + "px";
          canvas.style.height = height + "px";
          canvas.height = height * dpr;
          canvas.width = width * dpr;
          ctx.scale(dpr, dpr);
        }
      }

我们知道,高清屏下window.devicePixelRatio都大于1。所以在绘图之前画笔会被缩放:

ctx.scale(dpr, dpr);

我们知道cavnas是基于状态的绘图组件。 其中缩放比例值也在状态管理之中。 当我们重新设置canvas的宽(高也一样)的时候,不仅会清空canvas的画布内容,同时还会把绘图状态重置到最原始的状态,原始状态下画笔的缩放比例是1,缩放比例值会被重置为1,因而导致绘制效果错乱。
 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS实现鼠标滑过鼠标点击代码写法
Dec 26 HTML / CSS
css3 background属性调整增强介绍
Dec 18 HTML / CSS
CSS3 简写animation
May 10 HTML / CSS
使用css3和jquery实现可伸缩搜索框
Feb 12 HTML / CSS
CSS3中的transform属性进行2D和3D变换的基本用法
May 12 HTML / CSS
html5应用缓存_动力节点Java学院整理
Jul 13 HTML / CSS
HTML5新增的标签和属性归纳总结
May 02 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
Jun 16 HTML / CSS
一些常用的HTML5模式(pattern) 总结
Jul 14 HTML / CSS
HTML5中的拖放实现详解
Aug 23 HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
Nov 15 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
Jun 11 HTML / CSS
HTML table 表格边框的实现思路
Oct 12 #HTML / CSS
Html5自定义字体解决方法
Oct 09 #HTML / CSS
webView加载html图片遇到的问题解决
Oct 08 #HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
Oct 08 #HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
Oct 08 #HTML / CSS
html2canvas生成清晰的图片实现打印的示例代码
Sep 30 #HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
Sep 27 #HTML / CSS
You might like
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
linux下进程间通信的方式
2013/01/23 面试题
化工专业推荐信范文
2013/11/28 职场文书
技术经理的自我评价范文
2013/12/03 职场文书
幼儿教师思想汇报
2014/01/10 职场文书
培训协议书范本
2014/04/22 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
党委班子剖析材料
2014/08/21 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
物业工程部岗位职责
2015/02/11 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP