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 相关文章推荐
jQuery的12招常用技巧分享
Aug 08 Javascript
Mac地址验证的javascript代码
Nov 09 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
Aug 18 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
Jun 05 Javascript
JavaScript判断数组是否存在key的简单实例
Aug 03 Javascript
探索Javascript中this的奥秘
Dec 11 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
浅谈vuex actions和mutation的异曲同工
Dec 13 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 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 PDO中文乱码解决办法
2009/07/20 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
js控制frameSet示例
2013/09/10 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
全面理解闭包机制
2016/07/11 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
2017/03/21 jQuery
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
在Django中实现添加user到group并查看
2019/11/18 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
网络工程专业毕业生推荐信
2013/10/28 职场文书
公司市场部岗位职责
2013/12/02 职场文书
三好学生自我鉴定
2013/12/17 职场文书
警察思想汇报
2014/01/04 职场文书
回门宴父母答谢词
2014/01/26 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
关于感恩的作文
2019/08/26 职场文书
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers