2014-10-25 5 views
0

요구 복원HTML5 캔버스 - 캔버스에 그리기 컨텍스트를 저장하고 나중에

지금 : 캔버스에 그리기, 저장 히트 (저장 캔버스 상태/그리기 오프라인 - 이미지로하지만하지 않음).
나중에 : 이전에 저장 한 도면으로 캔버스를 열고 다시 그립니다. - 이미지에 수출하는 것은 도움이되지 않습니다 위해

canvas = document.getElementById('can'); 
ctx = canvas.getContext("2d"); 
... 
ctx.beginPath(); 
ctx.moveTo(prevX, prevY); 
ctx.lineTo(currX, currY); 
.... 

나중에 캔버스 상태를 복원하기 위해 다음과 같이

그리기 위해 우리는 일반적으로 코드를 사용합니다.
캔버스를 원래 상태로 복원하여 나중에 도면을 계속 편집하려고합니다.

캔버스 컨텍스트를 내보내고 오프라인으로 저장해야합니다. 어떻게?

답변

1

가장 좋은 방법은 그림 명령을 저장하고 도면을 수행하는 프록시를 사용하는 것입니다.
프록시에 대한 브라우저 지원이 매우 좋지 않기 때문에 (오늘의 FF 만 해당) 을 사용하거나 Context2D에서 새로운 새로운 WatchedContext 클래스를 빌드하여 프록시를 직접 만들어야합니다.
내가이 짧은 데모의 마지막 솔루션 (WatchedContext 클래스)에 나섭니다 :

function WatchedContext(hostedCtx) { 
    this.commands= []; 
    Context2dPrototype = CanvasRenderingContext2D.prototype; 
    for (var p in Context2dPrototype) { 
    this[p] = function(methodName) { 
     return function() { 
      this.commands.push(methodName, arguments); 
      return Context2dPrototype[methodName].apply(hostedCtx, arguments); 
     }  
    }(p); 
    } 
    this.replay=function() { 
    for (var i=0; i<this.commands.length; i+=2) { 
     var com = this.commands[i]; 
     var args = this.commands[i+1]; 
     Context2dPrototype[com].apply(hostedCtx, args); 
    } 
    } 
} 

은 확실히 당신은 다른 방법이 필요할 수도를 (시작/정지 기록, 명확한, ...)

그냥 작은 예 의 사용

var cv = document.getElementById('cv'); 
var ctx=cv.getContext('2d'); 
var watchedContext=new WatchedContext(ctx); 

// do some drawings on the watched context 
// --> they are performed also on the real context 
watchedContext.beginPath(); 
watchedContext.moveTo(10, 10); 
watchedContext.lineTo(100, 100); 
watchedContext.stroke(); 

// clear context (not using the watched context to avoid recording) 
ctx.clearRect(0,0,100,1000); 

// replay what was recorded 
watchedContext.replay(); 

당신은 여기에서 볼 수 있습니다

http://jsbin.com/gehixavebe/2/edit?js,output 

재생이 작동하고 저장된 명령을 재생 한 결과 행이 다시 그려집니다.

오프라인으로 저장하려면 localStorage를 사용하여 로컬로 명령을 저장하거나 AJAX 호출 또는 유사한 용도로 서버에 원격으로 저장할 수 있습니다.

+0

+1 가치가있는 멋진 시작 우물! 완료하려면 코드를 확장하여 컨텍스트 속성과 값을 반환하는 컨텍스트 메서드를 고려해야합니다. Object.defineProperty를 사용하여 컨텍스트 속성에 대한 getter/setter를 만들 수 있습니다. 대부분의 컨텍스트 메서드는 코드와 함께 직렬화되지만 일부 컨텍스트 메서드에는 특수 처리가 필요합니다. .drawImage (URL serialize), .createLinearGradient, .createRadialGradient, .createPattern, .measureText. .getImageData & .putImageData를 사용하여 픽셀을 조작하려면 전체 하위 시스템이 필요합니다. 아직도 ... 잘 했어! – markE

+0

@markE : 친절하고 관련있는 의견을 보내 주셔서 감사합니다. 저의 의도는 '짧은 데모'를 작성하는 것입니다. 즉, 문제를 해결할 수있는 방법을 보여준 다음 O.P.의 의견을 기다려야합니다. createPattern과 같은 몇 가지 메소드의 경우, 위의 로직은 실제로 많은 재 작업이 필요할 것입니다. 그러나 채우기/획/글꼴 변경을 포함하여 일부 기본 도면의 경우 속성에 대한 액세스를 허용하도록 일부 변경했습니다. 최신 시도는 http://jsfiddle.net/gamealchemist/b4bfj6uf/입니다. – GameAlchemist