가장 좋은 방법은 그림 명령을 저장하고 도면을 수행하는 프록시를 사용하는 것입니다.
프록시에 대한 브라우저 지원이 매우 좋지 않기 때문에 (오늘의 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 호출 또는 유사한 용도로 서버에 원격으로 저장할 수 있습니다.
+1 가치가있는 멋진 시작 우물! 완료하려면 코드를 확장하여 컨텍스트 속성과 값을 반환하는 컨텍스트 메서드를 고려해야합니다. Object.defineProperty를 사용하여 컨텍스트 속성에 대한 getter/setter를 만들 수 있습니다. 대부분의 컨텍스트 메서드는 코드와 함께 직렬화되지만 일부 컨텍스트 메서드에는 특수 처리가 필요합니다. .drawImage (URL serialize), .createLinearGradient, .createRadialGradient, .createPattern, .measureText. .getImageData & .putImageData를 사용하여 픽셀을 조작하려면 전체 하위 시스템이 필요합니다. 아직도 ... 잘 했어! – markE
@markE : 친절하고 관련있는 의견을 보내 주셔서 감사합니다. 저의 의도는 '짧은 데모'를 작성하는 것입니다. 즉, 문제를 해결할 수있는 방법을 보여준 다음 O.P.의 의견을 기다려야합니다. createPattern과 같은 몇 가지 메소드의 경우, 위의 로직은 실제로 많은 재 작업이 필요할 것입니다. 그러나 채우기/획/글꼴 변경을 포함하여 일부 기본 도면의 경우 속성에 대한 액세스를 허용하도록 일부 변경했습니다. 최신 시도는 http://jsfiddle.net/gamealchemist/b4bfj6uf/입니다. – GameAlchemist