2010-04-03 44 views
14

Tôi dường như không thể tìm thấy hàm để xóa hình dạng hoặc đường dẫn khỏi canvas sau khi đã được tạo.Javascript/jQuery: xóa hình dạng/đường dẫn khỏi canvas

Vì vậy, tôi tạo ra một đường cong Bezier giữa 2 điểm với

beginPath(); 
bezierCurveTo(); 
stroke(); 
closePath(); 

Làm thế nào tôi có thể loại bỏ điều này từ vải khi nó đã được tạo ra? Tôi cần có thể gọi chức năng xóa qua toggle()blur(). Tôi chắc chắn có điều gì đó tồn tại cho việc này ...

Cảm ơn bạn đã giúp đỡ!

+4

Tôi chỉ muốn đề cập rằng việc sử dụng 'closePath()' ở đây và trong nhiều câu trả lời là sai. Nó được sử dụng để hoàn thành một đường dẫn bằng cách vẽ một đường để bắt đầu đường dẫn. Gọi nó sau khi 'đột quỵ' không ** hoàn toàn không có gì. ** http://stackoverflow.com/questions/10807230/what-exactly-is-a-canvas-path-and-what-is-the-use-of- ctx-closepath –

Trả lời

3

Cảm ơn cho đầu vào tuyệt vời để tất cả các bạn - nó đã giúp tôi tìm ra giải pháp:

context.clearRect(x,y,w,h); 

(link)

này sẽ xóa bất cứ thứ gì trong phạm vi hình chữ nhật đó.

Tôi đã tìm thấy phương pháp trên trang tôi tìm thấy trong khi tìm kiếm câu trả lời của ILog để lưu/khôi phục ngữ cảnh và tất cả đều ở đó. Cảm ơn một lần nữa.

0

Theo như tôi nhớ đặc tả, bạn phải gọi context.save() trước khi vẽ, sau đó vẽ một cái gì đó, và sau đó gọi context.restore() để trở về trạng thái trước đó.

+1

Cảm ơn gợi ý - Tôi đã thử điều này (không thành công) và sau đó tìm thấy tài nguyên này (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html # the-canvas-state) nêu rõ: "Đường dẫn hiện tại và bitmap hiện tại không phải là một phần của trạng thái vẽ. Đường dẫn hiện tại là liên tục và chỉ có thể được đặt lại bằng phương thức beginPath(). tài sản của canvas, không phải bối cảnh. " Cảm ơn dù sao, nhiều đánh giá cao! – bobsoap

+0

lưu/khôi phục chỉ hoạt động khi một số thuộc tính nhất định của ngữ cảnh và gọi chúng sẽ không bao giờ có ảnh hưởng rõ ràng trên hình ảnh nếu bạn không vẽ thứ gì đó sau đó. [Bài viết này] (http://www.tutorialspoint.com/html5/canvas_states.htm) cung cấp thêm thông tin. –

3

Bạn không thể xóa đường dẫn/hình dạng khỏi canvas. Bạn có thể vẽ một cái gì đó khác trên đó hoặc xóa canvas.

1

Bạn có thể thử sử dụng SVG thay vì canvas. Có một thư viện tuyệt vời được gọi là Raphaël giúp làm việc với SVG dễ dàng. Nó cũng hoạt động trong tất cả các trình duyệt, bao gồm IE6.

Với SVG mỗi hình dạng là phần tử riêng của nó có thể được di chuyển, chuyển đổi hoặc xóa.

+0

Điều này có vẻ tuyệt vời, tôi đã xem xét nó. Cảm ơn! – bobsoap

+0

Nhận xét hồi tưởng ở đây - nếu bạn vẽ nhiều, SVG nói chung sẽ kém hiệu quả hơn canvas. Tôi hiện đang tái cấu trúc một ứng dụng thực hiện rất nhiều bản vẽ trong SVG để sử dụng canvas. –

0

Nếu bạn đang sử dụng JQuery:

var elem = $("selector"); 
var canvas = elem.get(0); 
var context = canvas.getContext("2d"); 

context.clearRect(0, 0, canvas.width, canvas.height); 
context.beginPath(); 

Thay thế "selector" với selector JQuery thực tế của bạn.

1

Để xóa canvas của bạn, sử dụng đoạn mã sau

canvas_context.clearRect(0,0,canvas_1.width,canvas_1.height); 

Luôn luôn sử dụng beginPath phương pháp khi bạn đang bắt đầu để vẽ một con đường mới và closePath phương pháp sau khi bạn đã hoàn thành bản vẽ con đường của bạn.

LƯU Ý:Đường dẫn không được đóng không thể xóa.

Nếu đường dẫn của bạn không bị xóa, đó phải là vì lý do trên.

Tất cả các con đường phải bắt đầu bằng beginPath() và kết thúc bằng closePath()

Ví dụ:

 canvas_context.beginPath(); 
    canvas_context.moveTo(x1,y1); 
    canvas_context.lineTo(x2,y2); 
    canvas_context.stroke(); 
    canvas_context.closePath(); 

Các mã sau đây cũng sẽ xóa canvas của bạn

canvas_1.width = canvas_1.width; 

GHI CHÚ:Câu lệnh trên sẽ khởi tạo lại một canvas do đó nó sẽ xóa canvas. Bất kỳ câu lệnh nào reinitializes canvas sẽ xóa một canvas.

+1

"Tất cả đường dẫn PHẢI bắt đầu bằng beginPath() và kết thúc bằng closePath()" - Sai! xem http://stackoverflow.com/questions/10807230/what-exactly-is-a-canvas-path-and-what-is-the-use-of-ctx-closepath –

+0

Chỉ cần kiểm tra lại trong Chrome của tôi và bạn đúng. Trở lại năm 2011 khi tôi thử nghiệm điều này trong Chrome, các đường dẫn không bị đóng chưa bao giờ bị xóa. Dù sao, cảm ơn cho việc cập nhật. –

6

Đây là điều quan trọng cần nhận ra về <canvas>. Đó là một hình ảnh phẳng tạo thành các điểm ảnh. Sau khi một cái gì đó được rút ra cho nó, nó được sáp nhập vào lưới pixel và không thể được phân biệt với các pixel khác.

Nếu bạn cần để có thể tách các yếu tố hình ảnh mà bạn có thể:

  1. Overlay <canvas> yếu tố vào một chồng lớp
  2. Sử dụng <svg> trong đó mỗi yếu tố hình ảnh khác với các yếu tố khác và có thể được thao tác độc lập

Bạn có thể xem <canvas> là một lớp trong PhotoShop/Gimp/Fireworks hoặc tài liệu MSPaint.

Bạn có thể xem <svg> làm tài liệu trong Illustrator/InkScape.

18

Hãy thử điều này:

ctx.save(); 
ctx.globalCompositeOperation = "destination-out"; 
// drawing here you path second time 
ctx.restore(); 

"Thuộc tính globalCompositeOperation đặt như thế nào hình dạng và hình ảnh được vẽ lên bitmap đầu" specs

Làm thế nào nó hoạt động bạn có thể thấy here.

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