我使用<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