2010-07-23 38 views

Trả lời

87

Trên thực tế cách chính xác để sao chép dữ liệu vải là để vượt qua vải cũ vào khung trống mới. Hãy thử chức năng này.

function cloneCanvas(oldCanvas) { 

    //create a new canvas 
    var newCanvas = document.createElement('canvas'); 
    var context = newCanvas.getContext('2d'); 

    //set dimensions 
    newCanvas.width = oldCanvas.width; 
    newCanvas.height = oldCanvas.height; 

    //apply the old canvas to the new one 
    context.drawImage(oldCanvas, 0, 0); 

    //return the new canvas 
    return newCanvas; 
} 

Sử dụng getImageData là để truy cập dữ liệu pixel, không phải để sao chép canvas. Sao chép với nó rất chậm và khó trên trình duyệt. Nó nên tránh.

+5

+1 trên tham chiếu 'drawImage()', nhưng đáng chú ý là lệnh gọi 'new Canvas()' không hoạt động trong tất cả các trình duyệt (đáng chú ý là Firefox) - thay vào đó bạn nên sử dụng 'document.createElement ('canvas')' –

+0

@AJ. Cảm ơn, tôi đã sửa nó. –

+0

lỗi khá lạ ở đây: khi tải một hình ảnh và điều chỉnh kích thước của vải cho phù hợp và _then_ nhân bản nó, nó chỉ sao chép 300px đầu tiên (theo chiều ngang) và 150px đầu tiên (theo chiều dọc) (xem http: //peter.muehlbacher. bảng điều khiển của tôi/sân chơi/sợi nấm? src = ../downloads/chess_pawn.png khi nhấp vào - nó ghi nhật ký các giá trị alpha của bản sao) – Peter

11

Bạn có thể gọi

context.getImageData(0, 0, context.canvas.width, context.canvas.height); 

mà sẽ trả về một đối tượng imageData. Điều này có một thuộc tính có tên là dữ liệu loại CanvasPixelArray có chứa giá trị rgb và độ trong suốt của tất cả các pixel. Các giá trị này không phải là tham chiếu đến canvas nên có thể thay đổi mà không ảnh hưởng đến canvas.

Nếu bạn cũng muốn có một bản sao của phần tử, bạn có thể tạo phần tử canvas mới và sau đó sao chép tất cả thuộc tính vào phần tử canvas mới. Sau đó, bạn có thể sử dụng phương thức

context.putImageData(imageData, 0, 0); 

để vẽ đối tượng ImageData vào phần tử canvas mới.

Xem câu trả lời này để biết thêm chi tiết getPixel from HTML Canvas? về thao tác pixel.

Bạn có thể tìm thấy bài viết này hữu ích mozilla cũng https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes

+0

Chỗ tốt. Cảm ơn. – Castrohenge

+2

Không phải là phương pháp sao chép tốt. Điều này phù hợp hơn cho việc lưu trữ dữ liệu. –

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