html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因


Posted in HTML / CSS onJanuary 09, 2013

接上一篇canvas画线条教程
上次我们讲到,canvas有时候会出现1像素的线条模糊不清且好像更宽的情况,如下图:
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因 
这样的线条显然不是我们想要的。
这篇文章的目的就是弄清楚里面的原理,以及解决它。
大家都知道屏幕上最小的显示尺寸就是1像素,虽然小于1像素的东西可能显示不出来,但计算机可不管,他会试着画一下。
其实像素终究来说也是一个单位,假如我们把画布放大到足够大,足以看清楚每个像素,会是什么情况呢?大概是这个样子:

html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因


每个像素都有起止范围,如图所示,他们的范围从左起,跨过1像素,到右止。
如果我们画1像素线条的时候,遵循像素的起止范围,那么我们肯定能得到一个很标准的细线。如下:

html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因


但遗憾的是canvas的线条画法不一样,上一篇文章我们已经说了,canvas的每条线都有一条无限细的“中线”,线条的宽度是从中线向两侧延伸的。如果我们还是从第2个像素点画一条线,那么线条的中线就会靠齐到第2个像素的起点,然后我们开始画了,问题也就来了:Canvas 的线条以中线向两侧延伸,而不是向某一边延伸(比如这里,如果只是往右侧延伸,那么我们的问题就不再是问题了),延伸过后我们的线条实际上是这样的:

html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因


此时又有个问题:计算机不允许出现小于1px的图形,所以他做了一个折中的事:把这两个像素都绘制了。
所以,如此一来,本来1px的线条,就成了看起来2px宽的线条。
失败的原因找到了:Canvas中的line把中线与像素的起点对齐了,而不是像素的中间点。
那么我们怎么解决这个蛋疼的问题?也许有人已经想到了:既然是因为两个的起点不一样,那我们就把他们的起点变得一样吧!
我们让线条的中线和像素的中间点对齐就行了!
像素的中间点很好找,比如第2像素的中间点,依据图上的解释就是1.5像素的位置,那么x像素的中间点就是(x-0.5)px。
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
 
当然,在不很严谨的场合,你使用x+0.5也是可以的。
现在我们在canvas上试试我们的研究结果。
复制代码
代码如下:

ctx.moveTo(100.5,100.5);
ctx.lineTo(200.5,100.5);
ctx.lineTo(200.5,200.5);
ctx.lineTo(100.5,200.5);
ctx.lineTo(100.5,100.5);
ctx.closePath();
ctx.lineWidth = 1;
ctx.strokeStyle = 'rgba(255,0,0,0.5)';
ctx.stroke();

html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因


看起来对了吧?
不过貌似这样一来我们画线的时候就非常纠结,难道每次都去加这个让人郁闷的0.5?当然不是,因为我们大部分时间都是用变量保存值的,就不用给每个值加0.5 了
而且,对于lineWidth>1 的线,我们也不用管它:因为只有线条宽1px的时候,这个问题才最明显。
HTML / CSS 相关文章推荐
CSS3中Transform动画属性用法详解
Jul 04 HTML / CSS
一款基于css3麻将筛子3D翻转特效的实例教程
Dec 31 HTML / CSS
HTML5 Web 存储详解
Sep 16 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
Aug 26 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
Dec 11 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
Nov 05 HTML / CSS
html5使用canvas画三角形
Dec 15 HTML / CSS
深入探究HTML5的History API
Jul 09 HTML / CSS
基于html5 DeviceOrientation 实现微信摇一摇功能
Sep 25 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
May 05 HTML / CSS
跨域修改iframe页面内容详解
Oct 31 HTML / CSS
分享CSS盒子模型隐藏的几种方式
Feb 28 HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
Jan 09 #HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
Jan 09 #HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
Jan 08 #HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
Jan 07 #HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
Jan 07 #HTML / CSS
html5 canvas-1.canvas介绍(hello canvas)
Jan 07 #HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
Jan 07 #HTML / CSS
You might like
WHOIS类的修改版
2006/10/09 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
Python实现将xml导入至excel
2015/11/20 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python如何使用字符打印照片
2020/01/03 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
Python内置函数及功能简介汇总
2020/10/13 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
英文版区域经理求职信
2013/10/23 职场文书
文明学生标兵事迹
2014/01/21 职场文书
保险专业自荐信范文
2014/02/20 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
公司岗位说明书
2015/10/08 职场文书
七夕情人节问候语
2015/11/11 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript
LeetCode189轮转数组python示例
2022/08/05 Python