高清屏下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之UI元素状态伪类选择器实例演示
Aug 11 HTML / CSS
CSS3 中的@keyframes介绍
Sep 02 HTML / CSS
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
Nov 05 HTML / CSS
html5构建触屏网站之网站尺寸探讨
Jan 07 HTML / CSS
IE10 Error.stack 让脚本调试更加方便快捷
Apr 22 HTML / CSS
HTML5的一个显示电池状态的API简介
Jun 18 HTML / CSS
HTML5中Localstorage的使用教程
Jul 09 HTML / CSS
html5本地存储 localStorage操作使用详解
Sep 20 HTML / CSS
Html5 video标签视频的最佳实践
Feb 26 HTML / CSS
简单实现一个手持弹幕功能+文字抖动特效
Mar 31 HTML / CSS
使用HTML+Css+transform实现3D导航栏的示例代码
Mar 31 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开发工具之vs2005图解
2008/01/12 PHP
PHP 木马攻击防御技巧
2009/06/13 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
node.js操作MongoDB的实例详解
2017/10/11 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
Vue实现菜单切换功能
2020/11/08 Javascript
推荐下python/ironpython:从入门到精通
2007/10/02 Python
Python入门篇之对象类型
2014/10/17 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
python实现windows下文件备份脚本
2018/05/27 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
Exception类的常用方法
2012/06/16 面试题
大学生个人推荐信范文
2013/11/25 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
社区敬老月活动总结
2015/05/07 职场文书
python b站视频下载的五种版本
2021/05/27 Python
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL