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学习之2D转换功能详解
Dec 23 HTML / CSS
一款纯css3实现的响应式导航
Oct 31 HTML / CSS
利用CSS3的transition属性实现滑动效果
Aug 05 HTML / CSS
简单总结CSS3中视窗单位Viewport的常见用法
Feb 04 HTML / CSS
CSS3让登陆面板3D旋转起来
May 03 HTML / CSS
CSS3实现多背景模拟动态边框的效果
Nov 08 HTML / CSS
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
Sep 10 HTML / CSS
CSS实现聊天气泡效果
Apr 26 HTML / CSS
使用html2canvas实现浏览器截图的示例代码
Jan 26 HTML / CSS
HTML5 语音搜索只需一句代码
Jan 03 HTML / CSS
如何查看浏览器对html5的支持情况
Dec 15 HTML / CSS
HTML中link标签属性的具体用法
May 07 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
深入了解php4(2)--重访过去
2006/10/09 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
jQuery 联动日历实现代码
2012/05/31 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
python基础教程之Hello World!
2014/08/29 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python银行系统实战源码
2019/10/25 Python
Python-split()函数实例用法讲解
2020/12/18 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
甲方资料员岗位职责
2013/12/13 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
实习单位意见
2015/06/04 职场文书
农村老人去世追悼词
2015/06/23 职场文书
庆元旦主持词
2015/07/06 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书