2016-08-10 11 views
2

캔버스에 CSS background-color: #D3D3D3; 및 하나의 속성 ctx.fillStyle = "#000";이 있습니다.
이 JS 코드는 획을 그대로두고 모든 것을 투명하게 만들어야합니다. 어떻게이 일을 성취 할 수 있습니까?캔버스 픽셀의 색이 맞는지 확인

imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; 

let clearBack = imageData; 
for (var i = 3; i < clearBack.length; i += 4) { 
    if (pixle is not black) { //if pixel belongs to the stroke leave it 
    clearBack[i] = 0; 
    } 
} 

답변

0

닫기가 완료되었습니다. 4 픽셀 (빨간색 녹색 파란색 알파)마다 이동하고 imageData로 각 색상을 확인할 수 있습니다. 그렇다면 검은 색이 아니라면 원하는대로하십시오.

putImageData을 사용하면 수정 된 픽셀을 다시 화면에 다시 쓸 수 있습니다. 원래 ImageData 개체를 imageData var에 유지해야합니다.

imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); //take away the .data 

var r, g, b, a; 

for(var i = 0; i+3 < imageData.data.length; i+=4) { 
    r = imageData.data[i]; 
    g = imageData.data[i+1]; 
    b = imageData.data[i+2]; 
    a = imageData.data[i+3]; 

    if((r > 0 || g > 0 || b > 0) && a > 0) { // if pixel is not black, and not transparent   
     imageData.data[i+3] = 0; //set alpha to 0 
    } 
} 

ctx.putImageData(imageData, 0, 0); //put the imageData back to the screen 

Heres a fiddle. 나는 거기에서 약간 다른 것을하고 있었다. 그러나 당신은 생각을 얻는다.

https://jsfiddle.net/q0n5sxku/

+0

데이터는 제 1 화소 따라서 어레이의 전후 값 I + 3 인 알파이고, 상기 제 4 개 값에 의해 참조되도록 배열 아닌가? 그렇다면 왜 코드는'[i + 3]가 아닌'a = imageData.data [i + 4]'라고 말합니까? 이 질문의 이유는 if 블록이 절대로 입력되지 않기 때문입니다. –

+0

내 실수는 오타입니다. – element11

관련 문제