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 相关文章推荐
CSS的pointer-events属性详细介绍(作用和注意事项)
Apr 23 HTML / CSS
纯css3实现鼠标经过图片显示描述的动画效果
Sep 01 HTML / CSS
用CSS3来实现社交分享按钮
Nov 11 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
Oct 29 HTML / CSS
10分钟理解CSS3 FlexBox弹性布局
Dec 20 HTML / CSS
CSS3 实现图形下落动画效果
Nov 13 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
Dec 04 HTML / CSS
html5的canvas方法使用指南
Dec 15 HTML / CSS
HTML5不支持标签和新增标签详解
Jun 27 HTML / CSS
浅谈移动端网页图片预加载方案
Nov 05 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
Apr 26 HTML / CSS
浅谈CSS不规则边框的生成方案
May 25 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
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
php自动加载代码实例详解
2021/02/26 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
年会搞笑主持词串词
2014/03/24 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
企业宣传稿范文
2015/07/23 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
分享提高 Python 代码的可读性的技巧
2022/03/03 Python