深入理解Canvas模糊问题产生的原因与解决办法

 更新时间:2024年04月03日 10:08:14   作者:送你颗糖呀  
我们在使用Canvas进行绘图时,经常会出现绘制的文字或者图片比较模糊,这篇文章我们就来讨论一下Canvas模糊问题产生的原因与解决办法吧

我们在使用Canvas进行绘图时,经常会出现绘制的文字或者图片比较模糊,下面让我们看一下其产生的原因以及如何解决这个问题。

一、模糊产生的原因

1、style 和 canvas 中定义的宽高不一致造成的

通常,在定义 canvas 时我们会这么写:

<canvas width="300" height="150" style="width: 300px; height: 150px;" id="canvas"></canvas>

其中,width、height 为 canvas 中绘制的大小,canvas 可以看成是一个画布,而 width、height 则分别代表这个画布所绘制区域的宽高。而 style 中定义的 width、height 则代表实际渲染到页面上的宽高。

那么问题来了,当 width、height 和 style 中定义的 width、height 不一致时,canvas 中绘制的元素会根据 width、height 进行缩放或者拉伸到 style 中所定义的 width、height,这就会导致所绘制的图像比较模糊。

2、所绘制的像素不足 1px

在屏幕上绘制图像时,最少支持的也是绘制 1px,那么比如我们绘制 0.5px,canvas 会将使用填充算法将其扩展到 1px,如果所扩展的颜色跟原来的颜色一致,那么肯定没有问题,但是会产生锯齿状的一个效果,所以 canvas 会采取周围的颜色取一个平均值,这就会导致模糊的产生。所以尽量不要设置半个像素。

3、受到高清屏幕的影响

在我们的普通屏幕上,设备像素比(Device Pixel Ratio:屏幕的物理像素 / css像素)为 1:1,在这种情况下不会产生模糊的问题。但是如果我们在一个 4k 的屏幕上,设备像素比为 1.5,那么也就是说屏幕的物理像素 / css像素等于 1.5,即一个 css 像素会渲染到 1.5 个设备像素上,这就会导致 css 像素会进行扩展,从而产生模糊的问题。

既然知道产生的原因,那么解决起来就很简单了。其主要的思想就是对 canvas 的 width、height 进行扩展,也就是扩展 canvas 画布的大小,但是 style 中的 width、height 并没有改变,这样 canvas 会进行缩放,这样一来,点就变多了,但是 canvas 本身的大小并没有改变(同二倍图、多倍图的原理相似)。

二、解决方法

具体来说,有两种解决方法:

方法一

扩展 canvas 并对 canvas 的绘制上下文也进行扩展,相当于同时扩展画布和画笔。

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const dpr = window.devicePixelRatio;

const { width, height } = canvas;

canvas.width = Math.round(width * dpr);
canvas.height = Math.round(height * dpr);

ctx.font = "bold 40px 宋体";
ctx.scale(dpr, dpr);

ctx.fillText("你好呀", canvas.clientWidth / 2, canvas.clientHeight / 2);

方法二

扩展 canvas,不扩展 canvas 绘制上下文,但在每次绘制元素时,需要对所绘制的元素进行扩展(即乘以一个设备像素比)。

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const dpr = window.devicePixelRatio;

const { width, height } = canvas;

canvas.width = Math.round(width * dpr);
canvas.height = Math.round(height * dpr);

// ctx.scale(dpr, dpr);
ctx.font = "bold 40px 宋体";

ctx.fillText("你好呀", (canvas.clientWidth / 2) * dpr, (canvas.clientHeight / 2)  * dpr);

三、知识补充

除了上文的方法,小编还为大家整理了其他Canvas模糊问题产生的解决方法,希望对大家有所帮助

方法

第一步:获取像素比

第二步:将 canvas 标签上的宽高属性设置为 显示大小 * 像素比

第三步:将 canvas 样式宽高设置为 显示大小

第四步:使用 scale 方法设置比值

第五步:绘制 canvas 图形

function createHDCanvas (canvas, w, h) {
  const ratio = window.devicePixelRatio || 1;
  canvas.width = w * ratio; // 实际渲染像素
  canvas.height = h * ratio; // 实际渲染像素
  canvas.style.width = `${w}px`; // 控制显示大小
  canvas.style.height = `${h}px`; // 控制显示大小
  const ctx = canvas.getContext('2d')
  ctx.scale(ratio, ratio)
  // canvas 绘制
  return canvas;
}

到此这篇关于深入理解Canvas模糊问题产生的原因与解决办法的文章就介绍到这了,更多相关Canvas模糊问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用JS剩余字数计算的代码

    用JS剩余字数计算的代码

    函数中首先给maxChars变量指定了值(输入区内最多可用的字符数,注意,该变量是个可用于计算的数值)
    2008-07-07
  • js判断主流浏览器类型和版本号的简单实现代码

    js判断主流浏览器类型和版本号的简单实现代码

    下面小编就为大家带来一篇js判断主流浏览器类型和版本号的简单实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • iframe实现与父页面跨域隔离的JavaScript 代码沙箱

    iframe实现与父页面跨域隔离的JavaScript 代码沙箱

    这篇文章主要介绍了使用iframe实现与父页面跨域隔离的JavaScript代码沙箱,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 微信小程序wxml不能使用Array.includes条件判断解决方法

    微信小程序wxml不能使用Array.includes条件判断解决方法

    这篇文章主要为大家介绍了微信小程序wxml不能使用Array.includes条件判断解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 打字效果动画的4种实现方法(超简单)

    打字效果动画的4种实现方法(超简单)

    下面小编就为大家带来一篇打字效果动画的4种实现方法(超简单)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • TypeScript内置工具类型快速入门运用

    TypeScript内置工具类型快速入门运用

    TypeScript 中内置了很多工具类型,我们无需导入,可以直接使用。 其中的很多都是比较常用的,接下来我们根据使用范围来一一介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • JS中截取数组的几种方法总结

    JS中截取数组的几种方法总结

    在JavaScript中数组是一种常用的数据结构,用于存储多个值,这篇文章主要给大家总结介绍了关于JS中截取数组的几种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • 11个教程中不常被提及的JavaScript小技巧(推荐)

    11个教程中不常被提及的JavaScript小技巧(推荐)

    这篇文章主要介绍了11个教程中不常被提及的JavaScript小技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • javascript中延迟加载的7种方法实现

    javascript中延迟加载的7种方法实现

    在web前端开发中,性能优化一直是一个非常重要的话题,JavaScript中延迟加载的方式有很多种,本文就来介绍了javascript中延迟加载的7种方法实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • JavaScript简单实现弹出拖拽窗口(二)

    JavaScript简单实现弹出拖拽窗口(二)

    这篇文章再次为大家详细介绍了JavaScript简单实现弹出拖拽窗口的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论