2010-09-24 142 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