canvas绘图不清晰的解决方案


Posted in Javascript onFebruary 28, 2017

现象描述

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

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';

改变后的效果图如下:

canvas绘图不清晰的解决方案

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

Javascript 相关文章推荐
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
父子窗体间传递JSON格式的数据的代码
Dec 25 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
使用闭包对setTimeout进行简单封装避免出错
Jul 10 Javascript
JavaScript实现按Ctrl键打开新页面
Sep 04 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
Jun 05 Javascript
移动端JQ插件hammer使用详解
Jul 03 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
浅析Bootstrap表格的使用
Jun 23 Javascript
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
解决vue build打包之后首页白屏的问题
Mar 06 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
jQuery树控件zTree使用方法详解(一)
Feb 28 #Javascript
js数字计算 误差问题的快速解决方法
Feb 28 #Javascript
js数字舍入误差以及解决方法(必看篇)
Feb 28 #Javascript
JS实现浏览器打印、打印预览示例
Feb 28 #Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 #Javascript
js中删除数组中的某一元素实例(无下标时)
Feb 28 #Javascript
jQuery图片切换动画效果
Feb 28 #Javascript
You might like
PHP脚本数据库功能详解(上)
2006/10/09 PHP
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
python文件操作整理汇总
2014/10/21 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
pandas数据拼接的实现示例
2020/04/16 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
求职自荐信的格式
2014/04/07 职场文书
大学生英语演讲稿
2014/04/24 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
2014年环卫工作总结
2014/11/22 职场文书
军事理论课感想
2015/08/11 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
Java设计模式之享元模式示例详解
2022/03/03 Java/Android