高清屏下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 相关文章推荐
CSS3弹性伸缩布局之box布局
Jul 12 HTML / CSS
css3 border-image使用说明
Jun 23 HTML / CSS
CSS3感应鼠标的背景闪烁和图片缩放动画效果
May 14 HTML / CSS
使用CSS3的::selection改变选中文本颜色的方法
Sep 29 HTML / CSS
纯css3制作煽动翅膀的蝴蝶的示例
Apr 23 HTML / CSS
canvas实现俄罗斯方块的方法示例
Dec 13 HTML / CSS
html5使用canvas画空心圆与实心圆
Dec 15 HTML / CSS
逼真的HTML5树叶飘落动画
Mar 01 HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 HTML / CSS
HTML5 Canvas实现放大镜效果示例
Mar 25 HTML / CSS
html5用video标签流式加载的实现
May 20 HTML / CSS
使用CSS3实现按钮悬停闪烁动态特效代码
Aug 30 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
PHP 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
在Python中处理时间之clock()方法的使用
2015/05/22 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
python脚本定时发送邮件
2020/12/22 Python
英文版餐饮运营管理求职信
2013/11/06 职场文书
平面设计岗位职责
2013/12/14 职场文书
建筑人员岗位职责
2013/12/25 职场文书
可口可乐广告词
2014/03/20 职场文书
结婚幸福感言
2015/08/01 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android