高清屏下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制作炫酷带方向感应的鼠标滑过图片3D动画
Mar 16 HTML / CSS
10分钟理解CSS3 FlexBox弹性布局
Dec 20 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
Jan 07 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
Jan 30 HTML / CSS
HTML5 创建canvas元素示例代码
Jun 04 HTML / CSS
HTML5 Canvas实现烟花绽放特效
Mar 02 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
Mar 14 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
Aug 18 HTML / CSS
iframe跨域的几种常用方法
Nov 11 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
Aug 11 HTML / CSS
CSS Transition通过改变Height实现展开收起元素
Aug 07 HTML / CSS
CSS控制继承中的height能变为可继承吗
Jun 10 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
php数据库抽象层 PDO
2011/05/07 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Javascript引用指针使用介绍
2012/11/07 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
python随机生成指定长度密码的方法
2015/04/04 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
平安建设工作方案
2014/06/02 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
python脚本框架webpy模板控制结构
2021/11/20 Python