2011-08-30 13 views
15

キャンバス要素にズームイン/アウト機能を実装しました。 キャンバスを拡大縮小してキャンバスを拡大してから、シーン全体を再描画します。 問題は、キャンバス上にたくさんのものがあるので、すべてを再描画するのに時間がかかることです。html5:キャンバスをイメージにコピーして戻す

イメージオブジェクトにキャンバスをコピーし、イメージをキャンバスにコピーして品質を落とさずにコピーする方法が必要です。キャンバスをjavascript変数にコピーし、この変数を後でキャンバスにコピーする特定のメソッドは何ですか?

私はインターネット上で良い説明を見つけることができなかったので、コードを書き留めるとうれしいです。

おかげで、

+0

を画像を追加しましたあなたは、ズーム画像を復元したい、またはサイズのようにしてください。それかiginallyだった? – Loktar

+0

いいえ、ビットマップに「品質を保持する」唯一の方法は再描画です。実際にそれらのピクセルを描画することなく、ズームインされたビットマップに余分なピクセルを追加する魔法の方法はありません。シャープネスを維持しながらズームイン/ズームアウトしたい場合は、Canvas(ビットマップ)ではなくSVG(ベクトル)を使用してください。 – robertc

+1

私は以下の回答のすべてのメソッドのパフォーマンステストを行っています。 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

Imageオブジェクトで呼び出されるdrawImage()よりも優れたパラメータとしてdrawImage()がCanvasで呼び出されていますか?他のキャンバスからのdrawImage()は、議論として? –

+0

キャンバスをデータURLに変換してImageにロードし、そのイメージで 'drawImage()'を呼び出すよりも、 'drawImage()'をキャンバスで呼び出すほうが速いと思います! – andrewmu

+0

多くの状態を配列に格納する必要がある場合はどうなりますか? 1つのキャンバスの束の配列を作成する必要がありますか?例えば'var numBuffers = 20; var tmpCan = document.createElement( 'canvas'); var buffers = [tmpCan]; for(var i = 1、len = numBuffers、i dylnmc

19

それを行うには、いくつかの方法があります。しかしputImageDatagetImageDataはかなり遅く、getImageDataputImageData方法Referenceをtheresの。もう1つの方法は、データをimageのメモリに保存し、それをはるかに速く呼び出すことです。そして、3番目の方法は、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

誰もがこれをjperperedしていますか? :D – JustGoscha

+0

@JustGoscha誰かがそれを持っていればサイモンサリスだろうと私は想像できません。 – 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

関連する問題