高清屏下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编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
Jan 07 HTML / CSS
CSS类名支持中文命名的示例
Apr 04 HTML / CSS
CSS3 @font-face属性使用指南
Dec 12 HTML / CSS
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
Aug 25 HTML / CSS
Css3新特性应用之视觉效果实例
Dec 12 HTML / CSS
css3实现文字扫光渐变动画效果的示例
Nov 07 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
Feb 19 HTML / CSS
HTML5声音录制/播放功能的实现代码
May 03 HTML / CSS
HTML5实现移动端弹幕动画效果
Aug 01 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
Aug 17 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
Feb 24 HTML / CSS
奇妙的 CSS shapes(CSS图形)
Apr 05 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模板技术原理【一】
2008/01/10 PHP
PHP Document 代码注释规范
2009/04/13 PHP
php pdo操作数据库示例
2017/03/10 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
Python中条件判断语句的简单使用方法
2015/08/21 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
django的settings中设置中文支持的实现
2019/04/28 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
python中比较两个列表的实例方法
2019/07/04 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
个人求职简历的自我评价
2013/10/19 职场文书
机电一体化求职信
2014/03/10 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
实习证明格式范文
2014/10/14 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书