2016-09-22 3 views
1

javascript 캔버스를 통해 이미지의 고리 (즉, 링)를 자르고 싶습니다. 나는 이미 접근법을 가지고있다. 그러나 나는 그 것이 너무 우아하지 않다고 생각한다. (그리고 왜 이것이 효과가 있는지, 왜 그것이 더 작은 원을 만들어 내는지 이해할 수 없다.)캔버스 - 클리핑 된 캔버스의 초록 모양

see this jsfiddle

context.drawImage(imageObj, 0, 0, 500, 500); 

    //crop outer circle 
    context2.beginPath(); 
    context2.arc(250, 250, 200, 0, 2 * Math.PI, false); 
    context2.closePath(); 
    context2.clip(); 

    //draw circle 
    context2.drawImage(canvas,0,0); 

    //crop inner circle 
    context2.beginPath(); 
    context2.arc(250, 250, 100, 0, 2 * Math.PI, false); 
    context2.closePath(); 
    context2.clip(); 

    //clear context 2 
    context2.clearRect(0,0,500,500) 

    // finally draw annulus 
    context2.drawImage(canvas2,0,0); 

이 할 수있는 더 좋은 방법은 무엇입니까?

+0

내가 목표를하지 않습니다. 캔버스에 드로잉 캔버스가 만족스럽지 않습니까? – Hydro

+0

@TheProHands 나는 두 번째 캔버스에 임시 이미지를 그리는 추가 단계없이 이미 클리핑 된 모양에서 모양을 자르고 싶습니다 (Photoshop에서는 "선 택에서 제외"라고합니다). 나는 하나의 단계에서 솔루션을 원한다. (또는 적어도 내 솔루션이 설명되기를 바란다.) – InsOp

답변

3

clip 메서드에서 호출하는 클리핑 영역이 스택하기 때문에 작동합니다.

IMO, 실제로는 클리핑하기 전에 ctx.save();을 호출해야하며 이후에는 ctx.restore()을 호출해야합니다. 이는 실제로 많은 방법입니다.

내 선호하는 방법은 compositing을 사용하는 것입니다

var ctx = canvas.getContext('2d'); 
 

 
var imageObj = new Image(); 
 

 
imageObj.onload = function() { 
 

 
    ctx.drawImage(imageObj, 0, 0, 500, 500); 
 
    // keep only the outer circle 
 
    ctx.globalCompositeOperation = 'destination-in'; 
 
    ctx.beginPath(); 
 
    ctx.arc(250, 250, 200, 0, 2 * Math.PI, false); 
 
    ctx.fill(); 
 
    // remove the inner one 
 
    ctx.globalCompositeOperation = 'destination-out'; 
 
    ctx.beginPath(); 
 
    ctx.arc(250, 250, 100, 0, 2 * Math.PI, false); 
 
    ctx.fill(); 
 
    // reset gCO 
 
    ctx.globalCompositeOperation = 'source-over'; 
 

 
}; 
 
imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg';
<canvas id="canvas" width="500" height="500"></canvas>

+0

완벽하다. 원하는 경우 다른 사용자가이 기능을 유용하게 사용할 수 있다고 생각하므로 내 질문 (제목을 더 이해하기 쉬운 것으로 편집)을 할 수 있습니다. – InsOp

+1

@InsOp,이 질문에 가장 적합한 제목이 무엇인지 확신 할 수 없습니다 ... 어쨌든 도움이 되었기 때문에 기쁩니다. 추신 : 다른 gCOs 및 주문 같은 결과를 얻을 수, 그것으로 재미를 ;-) – Kaiido