高清屏下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透明opacity和IE各版本透明度滤镜filter的最准确用法
Dec 20 HTML / CSS
CSS3动画:5种预载动画效果实例
Apr 05 HTML / CSS
HTML5 Canvas draw方法制作动画效果示例
Jul 11 HTML / CSS
HTML5 创建canvas元素示例代码
Jun 04 HTML / CSS
详解HTML5中的元素与元素
Aug 17 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
Sep 21 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
Mar 21 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
Jun 03 HTML / CSS
AmazeUI 评论列表的实现示例
Aug 13 HTML / CSS
HTML5 SEO优化的一些建议
Aug 27 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
Oct 28 HTML / CSS
html中相对位置与绝对位置的具体使用
May 15 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模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
php数组去除空值函数分享
2015/02/02 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
python中查看变量内存地址的方法
2015/05/05 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
浅析python redis的连接及相关操作
2019/11/07 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
浅析NumPy 切片和索引
2020/09/02 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
国税会议欢迎词
2014/01/16 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
计划生育个人总结
2015/03/02 职场文书
2019各种承诺书范文
2019/06/24 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
pytorch 6 batch_train 批训练操作
2021/05/28 Python