最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

HTML5Canvas中绘制一个像素宽的细线实现代码详情

来源:动视网 责编:小采 时间:2020-11-27 15:12:18
文档

HTML5Canvas中绘制一个像素宽的细线实现代码详情

HTML5Canvas中绘制一个像素宽的细线实现代码详情:正统的HTML5 Canvas中如下代码ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(10, 100); ctx.lineTo(300,100); ctx.stroke();运行结果绘制出来的并不是一个像素宽度的线感觉怎么好粗啊,跟常常见到的网页版各种绘制线效果很不一样,难道HTML5 Can
推荐度:
导读HTML5Canvas中绘制一个像素宽的细线实现代码详情:正统的HTML5 Canvas中如下代码ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(10, 100); ctx.lineTo(300,100); ctx.stroke();运行结果绘制出来的并不是一个像素宽度的线感觉怎么好粗啊,跟常常见到的网页版各种绘制线效果很不一样,难道HTML5 Can
 正统的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画线的一个小技巧

觉得不错请顶一下。

文档

HTML5Canvas中绘制一个像素宽的细线实现代码详情

HTML5Canvas中绘制一个像素宽的细线实现代码详情:正统的HTML5 Canvas中如下代码ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(10, 100); ctx.lineTo(300,100); ctx.stroke();运行结果绘制出来的并不是一个像素宽度的线感觉怎么好粗啊,跟常常见到的网页版各种绘制线效果很不一样,难道HTML5 Can
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top