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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
JS创建优美的页面滑动块效果 - Glider.js
Sep 27 Javascript
javascript 树控件 比较好用
Jun 11 Javascript
浏览器缩放检测的js代码
Sep 28 Javascript
jquery制作多功能轮播图插件
Apr 02 Javascript
JavaScript禁止复制与粘贴的实现代码
May 16 Javascript
AngularJs bootstrap搭载前台框架——准备工作
Sep 01 Javascript
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
javascript实现点击小图显示大图
Nov 29 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
Wordpress php 分页代码
2009/10/21 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
Python struct模块解析
2014/06/12 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python xml解析实例详解
2016/11/14 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
文职个人求职信范文
2013/09/23 职场文书
集团公司人力资源部岗位职责
2014/01/03 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
Django操作cookie的实现
2021/05/26 Python
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python