高清屏下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实现鼠标滑过鼠标点击代码写法
Dec 26 HTML / CSS
CSS3制作气泡对话框的实例教程
May 10 HTML / CSS
css3+伪元素实现鼠标移入时下划线向两边展开的效果
Apr 25 HTML / CSS
CSS3的 fit-content实现水平居中
Sep 07 HTML / CSS
CSS3实现红包抖动效果
Dec 23 HTML / CSS
html5 touch事件实现触屏页面上下滑动(二)
Mar 10 HTML / CSS
Html5移动端弹幕动画实现示例代码
Aug 27 HTML / CSS
html5 button autofocus 属性介绍及应用
Jan 04 HTML / CSS
html5唤起app的方法
Nov 30 HTML / CSS
利用Storage Event实现页面间通信的示例代码
Jul 26 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
Mar 04 HTML / CSS
基于CSS3画一个iPhone
Apr 21 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中文本数据翻页(留言本翻页)
2006/10/09 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
艺术用品:Arteza
2018/11/25 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
工商企业管理专业自荐信范文
2014/04/12 职场文书
集中采购方案
2014/06/10 职场文书
黄山导游词
2015/01/31 职场文书
运动会100米广播稿
2015/08/19 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
话题作文之成长
2019/12/09 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python