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

Posted flyfox1982

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高清屏下canvas重置尺寸引发的问题相关的知识,希望对你有一定的参考价值。

我们知道,清空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,因而导致绘制效果错乱。

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

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

以上是关于高清屏下canvas重置尺寸引发的问题的主要内容,如果未能解决你的问题,请参考以下文章

canvas 画布与画布内容都缩小如何实现?

高清 Canvas 原理与 fabric 实现

必须重置适配器后,蓝牙的 Python 代码会引发错误

移动端多行文本在横向屏和竖向屏下如何保持字号大小一致

支持动态或静态片段的不同屏幕尺寸?

如何从片段外部清除/重置地图?