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 相关文章推荐
使用JS+CSS3技术:让你的名字动起来
Apr 27 HTML / CSS
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
Oct 10 HTML / CSS
CSS3中currentColor关键字的妙用
Feb 27 HTML / CSS
CSS3改变浏览器滚动条样式
Jan 04 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
Mar 10 HTML / CSS
HTML5 标准将把互联网视频扔回到黑暗时代
Feb 10 HTML / CSS
HTML5上传文件显示进度的实现代码
Aug 30 HTML / CSS
HTML5新特性之type=file文件上传功能
Feb 02 HTML / CSS
Html5之title吸顶功能
Jun 04 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
Aug 27 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
Sep 25 HTML / CSS
浅析图片上传及canvas压缩的流程
Jun 10 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
PHPlet在Windows下的安装
2006/10/09 PHP
php中看实例学正则表达式
2006/12/25 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
PHP反射基础知识回顾
2020/09/10 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
详解a++和++a的区别
2017/08/30 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
灰雀教学反思
2014/04/28 职场文书
本科毕业生自荐信
2014/05/26 职场文书
合作协议书格式
2014/08/19 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
入党后的感想
2015/08/10 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android