高清屏下canvas重置尺寸引起的问题

咱们知道,清空canvas画布内容有如下两个方法。
第一种方法是cearRect函数:html

context.cearRect(0,0,canvas.width,canvas.height)

第二种方法就是用原值从新设置一下canvas的宽(或者高)前端

canvas.width = canvas.width
// or 
canvas.height = canvas.height

第二种方法能够起做用,是由于canvas的一个特色:html5

每当画布的高度或宽度被重设时,画布内容就会被清空。相关内容能够参考 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。因此在绘图以前画笔会被缩放:canvas

ctx.scale(dpr, dpr);

咱们知道cavnas是基于状态的绘图组件。 其中缩放比例值也在状态管理之中。 当咱们从新设置canvas的宽(高也同样)的时候,不只会清空canvas的画布内容,同时还会把绘图状态重置到最原始的状态,原始状态下画笔的缩放比例是1,缩放比例值会被重置为1,于是致使绘制效果错乱。架构

若是读者不清楚“高清屏下canvas处理绘制图形模糊及处理方式”和“canvas的绘制状态”等知识点不清楚,建议学习相关知识,也推荐有兴趣读者,订阅个人专栏:
Canvas高级进阶 https://xiaozhuanlan.com/canvas,相关知识会在
本文也是摘录自专栏的部份内容并改编而成的。

欢迎关注公众号“ITman彪叔”。彪叔,拥有10多年开发经验,现任公司系统架构师、技术总监、技术培训师、职业规划师。在计算机图形学、WebGL、前端可视化方面有深刻研究。对程序员思惟能力训练和培训、程序员职业规划有浓厚兴趣。
ITman彪叔公众号函数

相关文章
相关标签/搜索