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

2016-02-19 10:31 24 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐HTML5 Canvas画线技巧——实现绘制一个像素宽的细线,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - Web开发 】

正统的HTML5 Canvas中如下代码

代码如下:

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

运行结果绘制出来的并不是一个像素宽度的线

感觉怎么好粗啊,跟常常见到的网页版各种绘制线效果

很不一样,难道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画线的一个小技巧

觉得不错请顶一下。

来源:https://www.tulaoshi.com/n/20160219/1594896.html

延伸阅读
标签: Web开发
从今天开始,我们将开始一个关于html5 canvas的系列课程。这个系列是我读《HTML5 Canvas:Native Interactivity and Animation for the Web》后的总结,有兴趣的朋友可以去下载英文原版书籍阅读。这本书通过介绍canvas游戏开发的方式,向我们展现canvas强大的功能,我觉得相当不错,通过阅读这本书我学到了canvas很多的知识。其实canvas本身的ap...
标签: Web开发
复制代码代码如下: !DOCTYPE HTML html head meta charset="UTF-8" titleHTML5示例/title style type="text/css" #container{border:1px solid #ccc;width:800px;height:600px;position:relative;} canvas{position:absolute;top:0px;left:0px;z-index:1;} /style /head body select id="tools" option value="pen"铅笔/option op...
标签: Web开发
代码如下: !DOCTYPE html html head /head body onkeydown="changeDirect()" canvas id="tankMap" width="500px" height="300px" style="border:1px solid #d3d3d3;"您的浏览器不支持canvas标签/canvas script type="text/javascript" var canvas1=document.getElementById('tankMap'); var ctx=canvas1.getContext('2d'); var myX...
标签: Web开发
HTML5 Canvas中提供了实现图形平移,旋转,放缩的API。 平移(translate) 平移坐标translate(x, y)意思是把(0,0)坐标平移到(x, y),原来的(0,0)坐标则变成(-x, -y) 图示如下:   任何原来的坐标点p(ox, oy)在translate之后的坐标点为p(ox-x, oy-y),其中点(x, y)为平移 点坐标translate(x, y)。 代码演示: 代码如下: // trans...
标签: Web开发
Canvas里绘制椭圆是一个很常见的需求,比较新的HTML Canvas 2D Context W3C草案里面新增了ellipse方法绘制椭圆,但是目前大多数浏览器还没有实现该方法,所以需要用arc或者arcTo方法结合scale变形来绘制椭圆。 示例代码: 代码如下: canvas width="400" height="300"/canvas script var ctx = documentquerySelector('canvas')get...

经验教程

117

收藏

64
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部