DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> HTML基礎知識 >> HTML5詳解 >> HTML5 Canvas畫線技巧――實現繪制一個像素寬的細線
HTML5 Canvas畫線技巧――實現繪制一個像素寬的細線
編輯:HTML5詳解     
正統的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畫線的一個小技巧 

覺得不錯請頂一下。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved