2010-03-31 19 views
5

Tôi có mã tải một loạt các hình ảnh vào các phần tử img ẩn và sau đó là một vòng lặp Javascript đặt mỗi hình ảnh lên khung hình. Tuy nhiên, tôi muốn cắt từng hình ảnh sao cho nó là hình tròn khi được đặt trên canvas.Bạn có thể có nhiều vùng cắt trong Canvas HTML không?

vòng lặp của tôi trông như thế này:

$$('#avatars img').each(function(avatar) { 
     var canvas = $('canvas'); 
     var context = canvas.getContext('2d'); 

     var x = Math.floor(Math.random() * canvas.width); 
     var y = Math.floor(Math.random() * canvas.height); 

     context.beginPath(); 
     context.arc(x+24, y+24, 20, 0, Math.PI * 2, 1); 
     context.clip(); 

     context.strokeStyle = "black"; 

     context.drawImage(document.getElementById(avatar.id), x, y); 

     context.stroke(); 
    }); 

Vấn đề là, chỉ những hình ảnh đầu tiên được rút ra (hoặc có thể nhìn thấy).

Nếu tôi loại bỏ logic clipping:

$$('#avatars img').each(function(avatar) { 
     var canvas = $('canvas'); 
     var context = canvas.getContext('2d'); 

     var x = Math.floor(Math.random() * canvas.width); 
     var y = Math.floor(Math.random() * canvas.height); 

     context.drawImage(document.getElementById(avatar.id), x, y); 
    }); 

Sau đó, tất cả hình ảnh của tôi được rút ra.

Có cách nào để có được từng hình ảnh riêng lẻ không?

Tôi đã thử đặt lại khu vực cắt thành toàn bộ canvas giữa các hình ảnh nhưng không hoạt động.

Trả lời

7

Bạn nên cố gắng tiết kiệm nhà nước bối cảnh hiện nay và sau đó khôi phục lại nó:

 canvas = document.getElementById("area"); 
     context = canvas.getContext('2d'); 

     $("#avatars img").each(function(avatar) { 

      var x = Math.floor(Math.random() * canvas.width); 
      var y = Math.floor(Math.random() * canvas.height); 

      context.save();//push current state into canvas 
      context.beginPath(); 
      context.arc(x + 24, y + 24, 20, 0, Math.PI * 2, 1); 
      context.clip(); 

      context.strokeStyle = "black"; 

      //draw image this way 
      var img = new Image(); 
      img.src = avatar.src; 
      img.onload = function() { 
       context.drawImage(img, x, y); 
      }; 

      context.stroke(); 
      context.restore();//restore context to the state 

     }); 

Tôi nghĩ rằng khi bạn gọi phương thức drawImage, bạn cũng cần phải thiết lập thông số hình ảnh như một lớp hình ảnh bằng cách thêm một dòng nguồn đó là đã có trong thông số avatar.src của bạn.

Bạn nên kiểm tra tài liệu tham chiếu cho Canvas State

+1

lưu/khôi phục - đó là nó! cảm ơn bạn rất nhiều. không chắc chắn về đề xuất của bạn để vẽ các hình ảnh khác nhau. mã drawimage te hoạt động tốt theo cách tôi có nó bây giờ, những gì sẽ là lợi ích của việc sử dụng mã bạn cung cấp? – emh

+1

Thật đơn giản, bạn không cần phải thêm tất cả các tệp hình ảnh vào trang. Hiển thị nguồn vào lớp Image() sẽ là đủ. Nếu bạn loại bỏ những trang đó, trang của bạn sẽ không tải những hình ảnh đó khi tải trang. chúng ta đang nói về :) – Myra

+0

Hình ảnh không cắt đúng cho tôi .. – CarbonDry

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