2010-09-24 39 views
9

Tôi đang sử dụng <canvas> để nắm bắt dữ liệu nhập của người dùng dưới dạng chữ ký và đang cố gắng tìm ra cách làm mịn đầu vào từ chuột.Đường kẻ mịn được vẽ trong canvas

Tôi nghĩ rằng tôi cần phải xử lý các chuyển động của chuột của người dùng bằng đoạn và nhẵn từng đoạn, tôi không phải sau khi siêu mịn nhưng bất kỳ cải tiến nào trên đầu vào bị lởm chởm sẽ tốt.

Cảm ơn, Đánh dấu

+1

Bạn có cần một chữ ký đó là pháp lý cho, nói rằng, mục đích của hợp đồng? Nếu vậy, chữ ký được tạo ra có đủ không? –

Trả lời

12

Không chắc chắn điều này có thể giúp bạn, Tôi đã viết mã này từ đầu trong vài phút.

Hãy thử http://jsbin.com/ateho3

đánh dấu:

<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_ tuyệt vời trong vài phút làm việc. –

+1

Điều này không liên quan gì đến việc lắp đặt/làm trơn đường cong - nó chỉ vẽ các đoạn đường nối. –

0

xem xét kết nối các dấu chấm bằng cách sử dụng dây chuyền tự động, hoặc thậm chí, sử dụng quadraticCurveTo, nhưng bạn phải tính toán điểm trung lộ của chính mình.

+0

Lấy mẫu mỗi vài pixel và sau đó vẽ một thứ phân loại? thay vì vẽ từng chấm đơn được ghi lại? – dakine

1

Tôi chưa thử nghiệm điều này theo bất kỳ cách nào, nhưng bạn có thể thử vẽ các vòng tròn nhỏ với tô chuyển tiếp tô tròn.

2

Làm thế nào về việc sử dụng Bezier curves?

+1

Tôi đã sửa đổi ví dụ của Avinash để sử dụng 'bezierCurveTo' thay vì' lineTo'. Làm mịn sẽ rõ rệt hơn nếu bạn lấy mẫu mọi điểm khác. Ngay cả khi không làm mịn chữ ký của tôi không phải là khủng khiếp "lởm chởm". Các phần của chữ ký với độ trung thực kém nhất là những thay đổi tổng thể, mà không thực sự được giúp bằng cách làm mịn. –

+3

Xin chào @unclebrad, bạn đã đăng ví dụ đã sửa đổi của mình ở đâu đó chưa? Chúng tôi đang đối mặt với cùng một vấn đề. Cảm ơn! – Crashalot

4

Tôi phải tạo bản vẽ canvas mịn cho ứng dụng web dành cho thiết bị di động và đã học được vài điều. Các Answer of Avinash là rất tốt nhưng nếu bạn tăng chiều rộng dòng, khi bạn vẽ bạn sẽ thấy các dòng bị hỏng. Đó là bởi vì giới hạn dòng là hình chữ nhật theo mặc định.

Để làm cho dòng mượt mà hơn, bạn cần chỉnh sửa một chút gì đó.

ctx.lineCap = 'round';

tweak nhỏ này sẽ cung cấp cho bạn một đường siêu mịn.

Để biết thêm về điều này, hãy thử liên kết sau

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

+1

Cool .. bạn đóng đinh nó – Hasanavi

+0

nó không hoạt động nữa, bạn có thể sửa nó không? – Martian2049

Các vấn đề liên quan