canvas绘制锯齿问题

285 阅读1分钟

问题描述

当我们使用canvas进行绘制粗线条和圆形时,可能会出现边缘锯齿,如果你使用的是mac或者其他高分辨率的屏幕,这种感觉会尤为明显,如下图所示:

image.png

原因

canvas有两个宽高,一个是画布实际的像素宽高,一个是画布在页面所展示的CSS宽高,当我们只设置了画布实际的像素宽高时,画布的CSS宽高会默认相同,如果你的屏幕分辨率较高,在canvas所显示的区域中的像素数量大于canvas的实际像素时,在上面进行绘制就会产生锯齿感(这相当于放大了canvas)

解决办法

  1. 获取屏幕的物理像素分辨率与CSS像素分辨率之比(dpi)
  2. 设置canvas的CSS宽高
  3. 设置canvas的实际宽高等于CSS宽高乘dpi
  const scale = window.devicePixelRatio
  const size = 400
  canvas.style.width = size + 'px'
  canvas.style.height = size + 'px'
  canvas.value.width = Math.floor(size * scale)
  canvas.value.height = Math.floor(size * scale)

image.png