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 border-radius属性详解
Jul 05 HTML / CSS
深入理解css中vertical-align属性
Apr 18 HTML / CSS
详解CSS3新增的背景属性
Dec 25 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
Mar 06 HTML / CSS
CSS3实现时间轴特效
Nov 02 HTML / CSS
html5调用摄像头功能的实现代码
May 07 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
Jan 30 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
Jun 09 HTML / CSS
HTML5实现获取地理位置信息并定位功能
Apr 25 HTML / CSS
解决html5中video标签无法播放mp4问题的办法
May 07 HTML / CSS
canvas 下载二维码和图片加水印的方法
Mar 21 HTML / CSS
h5封装下拉刷新
Aug 25 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
美国美妆网站:B-Glowing
2016/10/12 全球购物
印尼旅游网站:via
2017/11/12 全球购物
初中同学聚会邀请函
2014/02/03 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
大课间体育活动方案
2014/03/12 职场文书
英语求职信范文
2014/05/23 职场文书
终止劳动合同协议书
2014/10/05 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
工作岗位职责范本
2015/02/15 职场文书
家庭经济困难证明
2015/06/23 职场文书
导游词书写之黄山
2019/08/06 职场文书