2010-03-31 11 views
5

Tengo un código que carga un montón de imágenes en elementos img ocultos y luego un bucle de Javascript que coloca cada imagen en el lienzo. Sin embargo, quiero recortar cada imagen para que sea un círculo cuando se coloca en el lienzo.¿Puede tener múltiples regiones de recorte en un lienzo HTML?

Mi bucle se ve así:

$$('#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(); 
    }); 

El problema es que solamente se dibuja la primera imagen (o visible).

Si quito la lógica de recorte:

$$('#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); 
    }); 

Entonces todas mis imágenes son atraídos.

¿Hay alguna manera de obtener cada imagen recortada individualmente?

Intenté restablecer el área de recorte para que fuera todo el lienzo entre las imágenes pero eso no funcionó.

Respuesta

7

Usted debe tratar de guardar el estado actual contexto y luego restaurarla:

 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 

     }); 

pienso cuando se llama método drawImage, también tiene que establecer parámetros de imagen como una clase imagen mediante la adición de una línea de base que es ya en su avatar.src parámetro.

debe comprobar los documentos de referencia para Canvas State

+1

Guardar/restaurar - eso fue todo! Muchas gracias. no estoy seguro acerca de su recomendación para dibujar las imágenes de manera diferente. El código de imagen está bien, tal como lo tengo ahora, ¿cuál sería el beneficio de usar el código que me proporcionó? – emh

+1

Eso es simple, no necesita agregar todos los archivos de imagen a la página. Mostrar el origen en la clase Image() será suficiente. El beneficio de eliminarlos permite que su página no cargue esas imágenes en la carga de la página. Es el tiempo de carga de la página (problema de rendimiento) estamos hablando de :) – Myra

+0

La imagen no está recortando correctamente para mí .. – CarbonDry

Cuestiones relacionadas