高清屏下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 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
Sep 02 HTML / CSS
CSS3实现的文本3D效果附图
Sep 03 HTML / CSS
纯CSS3发光分享按钮的实现教程
Sep 06 HTML / CSS
基于DOM+CSS3实现OrgChart组织结构图插件
Mar 02 HTML / CSS
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
Mar 16 HTML / CSS
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
Mar 02 HTML / CSS
css3实现六边形边框的实例代码
May 24 HTML / CSS
利用CSS3的3D效果制作正方体
Mar 10 HTML / CSS
html5绘制时钟动画
Dec 15 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
Mar 21 HTML / CSS
Html5获取高德地图定位天气的方法
Dec 26 HTML / CSS
使用CSS实现百叶窗效果示例代码
May 07 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 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
php之可变函数的实例详解
2017/09/13 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
Python工程师面试题 与Python Web相关
2016/01/14 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python opencv之SURF算法示例
2018/02/24 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python_mask_array的用法
2020/02/18 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
数据库笔试题
2013/05/09 面试题
后勤岗位职责
2013/11/26 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
探亲假请假条
2014/04/11 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
医院科室评语
2015/01/04 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript