2012-10-01 19 views
5

¿Es posible usar una imagen con una forma como máscara para todo un lienzo o imágenes dentro del lienzo?lienzo html5 usa la imagen como máscara

Quiero colocar imágenes en un lienzo con una máscara sobre las imágenes, y luego guardarlas como una nueva imagen.

+0

sí, si realmente hay algún área transparente en la imagen de la máscara, puede usar 'drawImage()' para dibujar la imagen en la parte superior del lienzo. La parte transparente dejará que la imagen/lienzo subyacente brille. – devnull69

+0

Eso no es lo que quiero decir, quiero que la forma recorta la imagen, para que el resto de la imagen se vuelva transparente. – Jaap

Respuesta

9

Puede utilizar una imagen en blanco y negro como una máscara usando 'source-in' globalCompositeOperation. Primero dibuja la imagen de tu máscara en el lienzo, luego cambias la opción globalCompositeOperation a 'source-in', finalmente dibujas tu imagen final.

Su imagen final solo se dibujará donde se superponga la máscara.

var ctx = document.getElementById('c').getContext('2d'); 

ctx.drawImage(YOUR_MASK, 0, 0); 
ctx.globalCompositeOperation = 'source-in'; 
ctx.drawImage(YOUR_IMAGE, 0 , 0); 

More info on global composite operations

+0

en parte funciona, cuando agrego más imágenes al lienzo falla. ¿Cómo puedo configurar la máscara correctamente, así que cuando cargo más imágenes, todavía usa la máscara? – Jaap

+0

Establezca la operación globalCompositeOperation nuevamente como originalmente después del dibujo (lo más probable es que sea "fuente-superior"). –

1

Además de la respuesta de Pierre también se puede utilizar una imagen en blanco y negro como fuente máscara para su imagen mediante la copia de sus datos en un CanvasPixelArray como:

var 
dimensions = {width: XXX, height: XXX}, //your dimensions 
imageObj = document.getElementById('#image'), //select image for RGB 
maskObj = document.getElementById('#mask'), //select B/W-mask 
image = imageObj.getImageData(0, 0, dimensions.width, dimensions.height), 
alphaData = maskObj.getImageData(0, 0, dimensions.width, dimensions.height).data; //this is a canvas pixel array 

for (var i = 3, len = image.data.length; i < len; i = i + 4) { 

    image.data[i] = alphaData[i-1]; //copies blue channel of BW mask into A channel of the image 

} 

//displayCtx is the 2d drawing context of your canvas 
displayCtx.putImageData(image, 0, 0, 0, 0, dimensions.width, dimensions.height); 
+3

Desafortunadamente, la derivación de píxeles no es tan eficiente, como lo es el método drawImage. –

Cuestiones relacionadas