HTML5 Canvas画线技巧——实现绘制一个像素宽的细线


Posted in HTML / CSS onAugust 02, 2013

正统的HTML5 Canvas中如下代码

复制代码
代码如下:

ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(10, 100);
ctx.lineTo(300,100);
ctx.stroke();

运行结果绘制出来的并不是一个像素宽度的线
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
感觉怎么好粗啊,跟常常见到的网页版各种绘制线效果

很不一样,难道HTML5 Canvas就没想到搞好点嘛

其实这个根本原因在于Canvas的绘制不是从中间开始的

而是从0~1,不是从0.5~1 + 0~0.5的绘制方式,所以

导致fade在边缘,看上去线很宽。

解决方法有两个,一个是错位覆盖法,另外一种是中心

平移(0.5,0.5)。实现代码如下:

错位覆盖法我已经包装成一个原始context的函数

复制代码
代码如下:

/**
* <p> draw one pixel line </p>
* @param fromX
* @param formY
* @param toX
* @param toY
* @param backgroundColor - default is white
* @param vertical - boolean
*/
CanvasRenderingContext2D.prototype.onePixelLineTo = function(fromX, fromY, toX, toY, backgroundColor, vertical) {
var currentStrokeStyle = this.strokeStyle;
this.beginPath();
this.moveTo(fromX, fromY);
this.lineTo(toX, toY);
this.closePath();
this.lineWidth=2;
this.stroke();
this.beginPath();
if(vertical) {
this.moveTo(fromX+1, fromY);
this.lineTo(toX+1, toY);
} else {
this.moveTo(fromX, fromY+1);
this.lineTo(toX, toY+1);
}
this.closePath();
this.lineWidth=2;
this.strokeStyle=backgroundColor;
this.stroke();
this.strokeStyle = currentStrokeStyle;
};

中心平移法代码如下:
复制代码
代码如下:

ctx.save();
ctx.translate(0.5,0.5);
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(10, 100);
ctx.lineTo(300,100);
ctx.stroke();
ctx.restore();

要特别注意确保你的所有坐标点是整数,否则HTML5会自动实现边缘反锯齿

又导致你的一个像素直线看上去变粗了。

运行效果:
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
现在效果怎么样,这个就是HTML5 Canvas画线的一个小技巧

觉得不错请顶一下。

HTML / CSS 相关文章推荐
Css3+Js制作漂亮时钟(附源码)
Apr 24 HTML / CSS
animation和transition的区别
Oct 12 HTML / CSS
html5理解head_动力节点Java学院整理
Jul 13 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
May 28 HTML / CSS
开发人员所需要知道的HTML5性能分析面面观
Jul 05 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
Oct 20 HTML / CSS
从零实现一个自定义html5播放器的示例代码
Aug 01 HTML / CSS
手机端用rem+scss做适配的详解
Nov 15 HTML / CSS
浅析HTML5:'data-'属性的作用
Jan 23 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
Jan 30 HTML / CSS
HTML5新特性之type=file文件上传功能
Feb 02 HTML / CSS
CSS实现多个元素在盒子内两端对齐效果
Mar 30 HTML / CSS
使用HTML5的File实现base64和图片的互转
Aug 01 #HTML / CSS
HTML5 中新的全局属性(整理)
Jul 31 #HTML / CSS
html5文字阴影效果text-shadow使用示例
Jul 25 #HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
Jul 25 #HTML / CSS
html5记忆翻牌游戏实现思路及代码
Jul 25 #HTML / CSS
html5 乒乓球(碰撞检测)实例二
Jul 25 #HTML / CSS
html5 迷宫游戏(碰撞检测)实例一
Jul 25 #HTML / CSS
You might like
很实用的一个完整email发送程序
2006/10/09 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
php简单统计在线人数的方法
2016/05/10 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
社团活动策划书范文
2014/01/09 职场文书
求职信需要的五点内容
2014/02/01 职场文书
保险公司年会主持词
2014/03/22 职场文书
品牌推广策划方案
2014/05/28 职场文书
大专毕业生求职信
2014/07/05 职场文书
调研座谈会发言材料
2014/08/23 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
廉洁自律证明
2015/06/24 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python