2010-09-24 72 views
9

我使用<canvas>以簽名的形式捕獲用戶輸入,並試圖弄清楚如何平滑鼠標輸入。在畫布上平滑用戶畫出的線條

我想我需要處理大塊的用戶鼠標移動塊,並平滑每個塊,我不是超級平滑之後,但鋸齒形輸入的任何改進都會很好。

謝謝, 馬克

+1

你需要一個簽名是合法的,比如說,合同目的?如果是這樣,這樣生成的簽名是否足夠? – 2010-09-24 17:03:01

回答

12

不知道這可能對你有幫助, 我在幾分鐘內從頭編寫了這段代碼。

試試看http://jsbin.com/ateho3

標記

<canvas id="canvas"></canvas> 

的JavaScript

window.onload = function() { 
    var canvas = document.getElementById('canvas'); 
    var ctx = canvas.getContext('2d'); 
    var width = window.innerWidth; 
    var height = window.innerHeight; 
    canvas.height = height; 
    canvas.width = width; 
    canvas.addEventListener('mousedown', function(e) { 
     this.down = true; 
     this.X = e.pageX ; 
     this.Y = e.pageY ; 
     this.color = rgb(); 
    }, 0); 
    canvas.addEventListener('mouseup', function() { 
     this.down = false;  
    }, 0); 
    canvas.addEventListener('mousemove', function(e) { 
     this.style.cursor = 'pointer'; 
     if(this.down) { 
      ctx.beginPath(); 
      ctx.moveTo(this.X, this.Y); 
      ctx.lineCap = 'round'; 
      ctx.lineWidth = 3; 
      ctx.lineTo(e.pageX , e.pageY); 
      ctx.strokeStyle = this.color; 
      ctx.stroke(); 

     this.X = e.pageX ; 
     this.Y = e.pageY ; 
     } 
    }, 0); 

    function rgb() { 
     color = 'rgb('; 
     for(var i = 0; i< 3; i++) { 
     color += Math.floor(Math.random() * 255)+','; 
     } 
     return color.replace(/\,$/,')'); 
    }  
    }; 
+2

+1 _very_酷了幾分鐘的工作。 – 2010-09-24 17:05:25

+1

這與曲線擬合/平滑無關 - 它只是繪製連線段。 – 2015-08-02 21:23:07

0

考慮通過線路連接點自動,甚至,用quadraticCurveTo,但是你必須自己計算的中間點。

+0

每隔幾個像素進行一次採樣然後繪製一條直線排列的東西?而不是繪製每個記錄的點? – dakine 2010-09-24 02:21:53

1

我還沒有以任何方式測試過,但您可以嘗試使用徑向填充漸變繪製小圓。

2

如何使用Bezier curves

+1

我修改了Avinash的例子,使用'bezierCurveTo'而不是'lineTo'。如果您對每個其他點進行採樣,則平滑更加明顯。即使沒有平滑我的簽名也不是非常「鋸齒」。簽名中忠誠度最低的部分是總體變化,這並不是通過平滑來實現的。 – 2010-09-25 00:32:38

+3

嗨@unclebrad,你有沒有發佈你的修改過的例子?我們正面臨同樣的問題。謝謝! – Crashalot 2012-03-27 18:44:24

4

我不得不爲一個移動Web應用程序製作一個平滑的畫布,並學習了幾件事情。 Answer of Avinash很棒,但是如果你增加線寬,當你繪製時你會看到虛線。這是因爲線帽默認是矩形的。

爲了使線更平滑,您需要調整一些東西。

ctx.lineCap ='round';

這個小小的調整會給你一個超級流暢的線條。

爲了更多地瞭解這一點,請嘗試以下鏈接

https://developer.mozilla.org/samples/canvas-tutorial/4_6_canvas_linecap.html

+1

酷..你釘了它 – Hasanavi 2014-04-22 11:27:19

+0

它不再工作,你能解決它嗎? – Martian2049 2016-03-31 19:18:58