我使用<canvas>
以簽名的形式捕獲用戶輸入,並試圖弄清楚如何平滑鼠標輸入。在畫布上平滑用戶畫出的線條
我想我需要處理大塊的用戶鼠標移動塊,並平滑每個塊,我不是超級平滑之後,但鋸齒形輸入的任何改進都會很好。
謝謝, 馬克
我使用<canvas>
以簽名的形式捕獲用戶輸入,並試圖弄清楚如何平滑鼠標輸入。在畫布上平滑用戶畫出的線條
我想我需要處理大塊的用戶鼠標移動塊,並平滑每個塊,我不是超級平滑之後,但鋸齒形輸入的任何改進都會很好。
謝謝, 馬克
不知道這可能對你有幫助, 我在幾分鐘內從頭編寫了這段代碼。
標記:
<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(/\,$/,')');
}
};
+1 _very_酷了幾分鐘的工作。 – 2010-09-24 17:05:25
這與曲線擬合/平滑無關 - 它只是繪製連線段。 – 2015-08-02 21:23:07
考慮通過線路連接點自動,甚至,用quadraticCurveTo
,但是你必須自己計算的中間點。
每隔幾個像素進行一次採樣然後繪製一條直線排列的東西?而不是繪製每個記錄的點? – dakine 2010-09-24 02:21:53
我還沒有以任何方式測試過,但您可以嘗試使用徑向填充漸變繪製小圓。
如何使用Bezier curves?
我修改了Avinash的例子,使用'bezierCurveTo'而不是'lineTo'。如果您對每個其他點進行採樣,則平滑更加明顯。即使沒有平滑我的簽名也不是非常「鋸齒」。簽名中忠誠度最低的部分是總體變化,這並不是通過平滑來實現的。 – 2010-09-25 00:32:38
嗨@unclebrad,你有沒有發佈你的修改過的例子?我們正面臨同樣的問題。謝謝! – Crashalot 2012-03-27 18:44:24
我不得不爲一個移動Web應用程序製作一個平滑的畫布,並學習了幾件事情。 Answer of Avinash很棒,但是如果你增加線寬,當你繪製時你會看到虛線。這是因爲線帽默認是矩形的。
爲了使線更平滑,您需要調整一些東西。
ctx.lineCap ='round';
這個小小的調整會給你一個超級流暢的線條。
爲了更多地瞭解這一點,請嘗試以下鏈接
https://developer.mozilla.org/samples/canvas-tutorial/4_6_canvas_linecap.html
酷..你釘了它 – Hasanavi 2014-04-22 11:27:19
它不再工作,你能解決它嗎? – Martian2049 2016-03-31 19:18:58
你需要一個簽名是合法的,比如說,合同目的?如果是這樣,這樣生成的簽名是否足夠? – 2010-09-24 17:03:01