2011-08-30 6 views
15

캔버스 요소에 확대/축소 기능을 구현했습니다. 캔버스 크기를 조정하고 변환 한 다음 전체 장면을 다시 그려서 작동합니다. 문제는 캔버스에서 많은 것을 얻었 기 때문에 모든 것을 다시 그리는 데 많은 시간이 걸리는 것입니다.html5 : 캔버스를 이미지에 복사하고 뒤로

캔버스를 이미지 개체에 복사하고 품질을 떨어 뜨리지 않고 이미지를 캔버스로 다시 복사하는 방법이 필요합니다. 자바 스크립트 변수에 캔버스를 복사하고 나중에이 변수를 캔버스로 다시 복사하는 구체적인 방법은 무엇입니까?

인터넷을 통해 좋은 설명을 찾을 수 없기 때문에 코드를 적어두면 기쁠 것입니다.

감사

+0

하면 이미지가 확대 복원하려는, 또는 크기로 또는 수행 이가야? – Loktar

+0

아니요, 비트 맵에서 '품질 유지'하는 유일한 방법은 다시 그리는 것입니다. 실제 픽셀을 그리지 않고 확대 된 비트 맵에 여분의 픽셀을 추가하는 마법 같은 방법은 없습니다. 선명도를 유지하면서 확대 및 축소하려면 Canvas (비트 맵) 대신 SVG (벡터)를 사용하십시오. – robertc

+1

그래, 아래 답변의 모든 방법에 대한 성능 테스트를 수행했습니다. 다른 캔버스의 drawImage()가 가장 빠를 것 같습니다 : http://jsperf.com/canvas-image-store-restore – JustGoscha

답변

26

의 drawImage() 메소드는 다른 캔버스 대신 화상을 이용 캔버스에 그릴 수있다.

원본과 크기가 같은 '백업'캔버스를 만든 다음 첫 번째 캔버스를 그려 놓은 다음 필요할 때 원본을 다시 그릴 수 있습니다.

// Assume we have a main canvas 
// canvas = <main canvas> 
ctx = canvas.getContext('2d'); 
.. 

// create backing canvas 
var backCanvas = document.createElement('canvas'); 
backCanvas.width = canvas.width; 
backCanvas.height = canvas.height; 
var backCtx = backCanvas.getContext('2d'); 

// save main canvas contents 
backCtx.drawImage(canvas, 0,0); 

.. 

// restore main canvas 
ctx.drawImage(backCanvas, 0,0); 
+0

ImageImage()보다 ImageImage()가 더 좋은 매개 변수로 drawImage()가 호출되었습니다. 논쟁으로? –

+0

캔버스를 데이터 URL로 변환하는 것보다'drawImage()'를 호출하는 것이 더 빠를 것이라고 상상해보십시오. 이미지 URL을 캔버스로 변환 한 다음 Image로 불러 와서 해당 이미지로 drawImage()를 호출하십시오! – andrewmu

+0

어레이에 많은 상태를 저장해야한다면 어떻게해야할까요? 하나의 캔버스 배열을 만들어야합니까 ?? 예 : 'var numBuffers = 20; var tmpCan = document.createElement ('canvas'); var buffers = [tmpCan]; for (var i = 1, len = numBuffers, i dylnmc

19

getImageDataputImageData 방법 Reference, 그러나 putImageDatagetImageData을 프로그래머 할 수있는 몇 가지 방법이 있습니다 꽤 느리다. 또 다른 방법은 메모리에있는 image에 데이터를 저장하고 훨씬 빠른 데이터를 호출하는 것입니다. 그런 다음 세 번째 방법은 다른 캔버스 요소에 복사하는 andrewmu에서 언급 한 위의 방법입니다. 나는 첫 번째와 두 번째 유형에 대한 예제를 포함시켰다.

Image in memory method

var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"), 
    savedData = new Image(); 

function save(){ 
    // get the data 
    savedData.src = canvas.toDataURL("image/png"); 
} 

function restore(){ 
    // restore the old canvas 
    ctx.drawImage(savedData,0,0) 
} 

getImageData putImageData method

// Setup our vars, make a new image to store the canvas data 
var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"), 
    canvasData = ''; 

function save(){ 
    // get the data 
    canvasData = ctx.getImageData(0, 0, 100, 100); 
} 

function restore(){ 
    // restore the old canvas 
    ctx.putImageData(canvasData, 0, 0); 
} 
+0

누구나 jsperfed이 있나요? : D – JustGoscha

+0

@JustGoscha 누군가가 Simon Sarris가된다면 나는 상상할 수 없다. – Loktar

1
캔버스에

추가 이미지

var image = new Image(); 
image.src = "1.jpg"; 
image.onload = function() { 
context.drawImage(image, 0, 0); 
}; 
+0

(1) op에는 이미 캔버스가 채워져 있습니다. 따라서 캔버스를로드 한 후에 이미지를 캔버스에로드하는 방법을 알 필요가 없습니다. (2) op는 캔버스를 이미지로 변환하는 방법을 묻고 이미지에 대한 참조를 유지 한 다음 나중에 다른 사람들이 지적했듯이 toDataUrl() ==> img.src 또는 임시 캔버스를 사용하여 이미지를 캔버스에 표시 할 수 있습니다. 그러나 귀하의 대답은 그 질문에 대한 답에 거의 가깝지 않습니다. 어쩌면 사람들을 혼동하지 않도록 수정하거나 제거 할 수 있습니다. – dylnmc

관련 문제