2013-08-08 5 views
1

자바에서 canvas.putImageData에 대한 사용자 지정 호출 횟수를 만드는 응용 프로그램을 빌드하고 있습니다. putImageData에 대한 각 호출 사이에서 이미지 데이터가 수정됩니다. 데이터를 수정하는 데 필요한 시간은 호출마다 다릅니다. 또한 사용자는 실행 중일 때 애니메이션을 멈출 수 있어야합니다 (버튼을 사용하고 있습니다). 처음에는 다음과 같이 사용했습니다 :HTML5의 canvas.putImageData에 대한 복수 호출

for (var i=0; i < n; i++) { 
    canvas.putImageData(imgdata, 0, 0); 
    modify(imgdata); 
} 

그러나 이것은 각 프레임을 표시하지 않으며 마지막 프레임 만 표시합니다. 작동은 canvas.putImageData 이후에 경고를하는 것입니다.하지만 그것은 매우 짜증납니다. 내가 제안 많은 분들 해요로 setIntervalcancelInterval를 사용했지만,이 두 가지 이유로 나를 위해 작동하지 않습니다

  • 이미지 데이터를 수정하는 데 필요한 시간이 달라집니다.
  • setInterval은 비동기입니다. 내가 사용하는 지연이 너무 짧으면 수정 (imgdata) 호출이 스택에 쌓여 사용자가 원할 때 애니메이션을 중단 할 수 없습니다.

이 작업을 올바르게 수행하려면 어떻게해야합니까?

+0

크기 조정 방법이 훌륭합니다! 그러나 코드를 살펴보면 캐시의 너비, 높이, 중요한 것은 코어 루프에서 사용하는 대신 모든 메소드의 데이터 (var imgData = img.data)를 사용하는 것이 매우 간단하다는 것을 알았습니다. 또한 계산을 반복하는 캐시 (4 * ...). 경우에 따라 32 비트 또는 64 비트의 성능 배열을 사용할 수도 있으며, stackEnd는 한 가지 예입니다. (나는 이것에 대해 조금 이야기했다 : http://stackoverflow.com/a/14429346/856501). – GameAlchemist

답변

0

은 반복의 setTimeout()를 사용

var shouldStop = false; 

function iteration() { 
    canvas.putImageData(imgData, 0, 0); 
    modify(imgData); 

    if (!shouldStop) { 
    window.setTimeout(iteration, 1000); 
    } 
} 

function stop() { 
    shouldStop = true; 
} 

이 표시 화상 데이터를 매 초마다 변경된다.

다른 해결책은 수정 알고리즘을 웹 작업자에게 위임하는 것입니다.

+0

우수! 이것은 완벽하게 작동했습니다! 정말 고마워! 지금 신청하면 도움이 될 것입니다. https://dl.dropboxusercontent.com/u/178840674/seamCarve.html 이미지를 업로드 한 다음 "편집 모드 :"에 대해 크기 조정 모드 -> 최적을 선택하십시오. 그런 다음 이미지의 아무 곳이나 클릭하거나 텍스트 상자를 편집하여 애니메이션을보십시오. "취소"버튼을 사용하여 애니메이션을 중지하십시오. –