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

简介: 高清屏下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,相关知识会在 本文也是摘录自专栏的部分内容并改编而成的。


相关文章
|
2月前
|
前端开发 JavaScript
鼠标移动淡入淡出Canvas小球效果_TS版本
使用TypeScript重新实现鼠标移动产生淡入淡出Canvas小球效果。涉及到TS的数据类型、泛型定义、函数与接口定义、类的实现及作为接口的使用,以及枚举类型。通过定义Ball类实现小球的属性和行为,使用事件监听鼠标移动并创建小球实例,然后使用requestAnimationFrame实现动画效果。
27 0
鼠标移动淡入淡出Canvas小球效果_TS版本
|
4月前
|
前端开发
如何在页面中画一个canvas,然后在居中位置写上蓝色‘Hello Canvas‘,并加上文字描边 * @type {HTMLElement}
如何在页面中画一个canvas,然后在居中位置写上蓝色‘Hello Canvas‘,并加上文字描边 * @type {HTMLElement}
|
XML 前端开发 Java
用Canvas绘制一个数字键盘
用Canvas轻轻松松搞一个数字键盘,本身没什么难度,这种效果实现的方式也是多种多样,这篇只是其中的一种,要说本篇有什么特别之处,可能就是纯绘制,没有用到其它的任何资源,一个类就搞定了。
113 0
|
前端开发 算法 JavaScript
使用 canvas 拖拽绘制矩形(带撤销)
之前预览网络摄像头的需求又有了下文,要在视频预览之上进行拖拽生成矩形边框,用于后台算法对区域内容进行一些处理。
333 0
VC下利用Picture控件实现png图片按钮(鼠标初始、按下、松开、获得焦点四种状态)
VC下利用Picture控件实现png图片按钮(鼠标初始、按下、松开、获得焦点四种状态)
129 0
|
Java Android开发
C# 获取当前屏幕的宽高和位置
原文:C# 获取当前屏幕的宽高和位置 上一篇博客《C# 获取当前屏幕DPI》,介绍了如何获取当前屏幕的DPI设置 本章主要介绍如何获取当前窗口所在屏幕的信息 当前屏幕信息 如果当前是单屏幕,可以直接获取主屏幕 var primaryScreen = Screen.
1294 0
slider 设置滑过的和未滑的的图片
实现效果: image.png 主要代码: //设置已经滑过一端滑动条背景图片,会覆盖之前之前的颜色,以下相同 [sli1 setMinimumTrackImage:[UIImage imageNamed:@"sliderImage.
1081 0