2012-10-01 4 views
5

모양이있는 이미지를 전체 캔버스 또는 캔버스의 이미지 마스크로 사용할 수 있습니까?html5 canvas 이미지를 마스크로 사용

이미지 위에 마스크로 캔버스에 이미지를 놓은 다음 새 이미지로 저장하려고합니다.

+0

예, 실제로 마스크 이미지에 투명 영역이 있다면'drawImage() '를 사용하여 이미지를 캔버스 위에 그릴 수 있습니다. 투명 부분은 밑에있는 이미지/캔버스가 빛나게합니다. – devnull69

+0

그게 무슨 뜻이 아니에요, 모양을 이미지 클립, 그래서 나머지는 이미지가 투명하게됩니다. – Jaap

답변

9

'source-in'globalcompositeOperation을 사용하여 흑백 이미지를 마스크로 사용할 수 있습니다. 먼저 캔버스에 마스크 이미지를 그린 다음 globalcompositeOperation을 'source-in'으로 변경하고 마지막으로 최종 이미지를 그립니다.

최종 이미지는 마스크가 겹쳐지는 부분 만 그립니다. 피에르의 대답에 추가

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

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

+0

캔버스에 그림을 추가 할 때 부분적으로 작동합니다. 어떻게 마스크를 적절하게 설정할 수 있습니까? 더 많은 이미지를로드 할 때 여전히 마스크를 사용합니까? – Jaap

+0

globalCompositeOperation을 그리기 후에 다시 원래대로 설정합니다 (대체로 "원본 초과"). –

1

More info on global composite operations 당신은 또한 같은 CanvasPixelArray로 데이터를 복사하여 이미지의 마스크 소스로 흑백 이미지를 사용할 수 있습니다

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

불행하게도, drawImage 메서드가 그렇듯이 픽셀 바이 패스는 그리 효율적이지 않습니다. –