canvas绘图不清晰的解决方案

 更新时间:2017年02月28日 09:24:26   作者:Young Dreamer  
本文主要介绍了canvas绘图不清晰的解决方案,具有很好的参考价值,下面跟着小编一起来看下吧

现象描述

  同样大小的图片(60x60px)用canvas和DOM绘制,结果发现canvas的画面质量要差很多。结果如下图所示。

  上图中,左侧红框中的金币采用DOM绘制,右侧和下方的金币和文字等使用canvas绘制,结果canvas绘制的图片模糊不清。

原因分析

  假设dpr = 2;图片大小为60x60px;对dpr有一定的了解基础。

  1.DOM呈现图片过程

  图片——》浏览器css像素(显示尺寸)——》屏幕实际像素

  60x60              30x30                              60x60

  图片像素——》实际像素

  1: 1

  2.canvas绘制过程

  图片像素——》canvas像素(画布尺寸)——》css像素(显示尺寸)——》屏幕实际像素

  60x60               30x30                              30x30                          60x60

  图片像素——》画布像素——》实际像素

  4:                    1:                  4

  也就是说,canvas的绘制过程中图片到画布的过程中进行了像素的抽稀,画布到屏幕像素时又进行了插值,所以造成图片质量下降。

解决方案

  放大画布的尺寸,但是canvas显示尺寸不变;

  图片像素——》canvas像素(画布尺寸)——》css像素(显示尺寸)——》屏幕实际像素

  60x60               60x60                                           30x30            60x60

  图片像素——》实际像素

  1:                1 

而canvas的设计的时候正好有对象的属性来分别管理画布尺寸和显示尺寸;canvas的width、height属性用于管理画布尺寸;canvas的style属性中的width、height正好是显示尺寸。

也就是说解决方案就是设置舞台的尺寸和图片像素的尺寸一致,显示尺寸为正常显示尺寸;假设canvas的显示尺寸为窗口宽度,创建canvas的时候指定canvas的width属性为2 * body.clientHeight;style.widht为body.clientHeight + 'px';

改变后的效果图如下:

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 前端取消接口调用的方法示例

    前端取消接口调用的方法示例

    这篇文章主要介绍了前端取消接口调用的相关资料,讲解了XMLHttpRequest和AbortController两种取消HTTP请求的方法,XMLHttpRequest通过abort()方法取消请求,而AbortController提供了一个更现代和灵活的解决方案,需要的朋友可以参考下
    2025-03-03
  • js removeChild 障眼法 可能出现的错误

    js removeChild 障眼法 可能出现的错误

    js removeChild 障眼法之可能出现的错误,大家看下代码就知道了。
    2009-10-10
  • ES2015 Symbol 一种绝不重复的值

    ES2015 Symbol 一种绝不重复的值

    这篇文章主要介绍了Symbol是ES2015新增的一种值类型数据,表示一种绝不重复的值,需要的朋友可以参考下
    2016-12-12
  • JavaScript进阶之前端文件上传和下载示例详解

    JavaScript进阶之前端文件上传和下载示例详解

    这篇文章主要为大家介绍了JavaScript进阶之前端文件上传和下载示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 读懂CommonJS的模块加载

    读懂CommonJS的模块加载

    这篇文章主要介绍了CommonJS的模块加载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 基于substring()和substr()的使用以及区别(实例讲解)

    基于substring()和substr()的使用以及区别(实例讲解)

    下面小编就为大家分享一篇基于substring()和substr()的使用以及区别实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 让你一句话理解闭包(简单易懂)

    让你一句话理解闭包(简单易懂)

    下面小编就为大家带来一篇一句话理解闭包(简单易懂)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 关于JS中的undefined与null详解

    关于JS中的undefined与null详解

    在JavaScript中,undefined和null是两个特殊的值,用于表示缺失或空值,文章通过代码示例详细介绍undefined与null作用及使用方法,感兴趣的同学可以借鉴一下
    2023-05-05
  • 利用JS实现抢红包的三种算法

    利用JS实现抢红包的三种算法

    对于抢红包来说最重要的就是随机性算法,如何确保每个人获得金额是趋向于平均的,也就是有平均的概率去随机,而尽量避免两极分化,本文给大家介绍了用JS实现抢红包的三种算法,文中有相关的代码示例,需要的朋友可以参考下
    2024-03-03
  • 使用JS实现图片轮播的实例(前后首尾相接)

    使用JS实现图片轮播的实例(前后首尾相接)

    下面小编就为大家带来一篇使用JS实现图片轮播的实例(前后首尾相接)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论