2011-08-30 37 views
15

Bir tuval öğesinde yakınlaştırma ve uzaklaştırma işlevini uyguladım. tuvali ölçekleyerek, çevirerek ve tüm sahneyi yeniden çizerek çalışır. problemi, her şeyi yeniden çizmenin çok zaman almasıdır çünkü tuvalimde birçok şey var.html5: resme ve tekrar bir kanvas kopyalayın

Tuvali bir görüntü nesnesine kopyalamanın ve görüntüyü kaliteden ödün vermeden tekrar kanvasına kopyalamanın bir yoluna ihtiyacım var. Tuvali bir javascript değişkenine kopyalamak ve bu değişkeni daha sonra tuvale kopyalamak için özel yöntemler nelerdir?

Kodu yazdığınızda internet üzerinden iyi bir açıklama bulamadığım için memnun olacağım.

sayesinde

+0

görüntü uzaklaştırdınız geri yüklemek istediğiniz veya boyut gibi o ya mı sonunda mıydı? – Loktar

+0

Hayır, bir kaliteyi "kaliteyi korumanın" tek yolu yeniden çizmektir. Bu pikselleri gerçekte çizmeden yakınlaştırılmış bitmap'e ekstra piksel eklemenin sihirli bir yolu yoktur. Keskinliği korurken yakınlaştırmak ve uzaklaştırmak istiyorsanız, Canvas (bitmap) yerine SVG (vektör) kullanın. – robertc

+1

Tamam, aşağıdaki yanıtlarda tüm yöntemler için performans testleri yaptım. Başka bir tuvalden drawImage() en hızlı gibi görünüyor:http://jsperf.com/canvas-image-store-restore – JustGoscha

cevap

26

drawImage() yöntemi bir tuval yerine bir resim ve bir tuval çizebilir.

Orijinalinizle aynı boyutta bir 'yedek' tuval yaratabilirsiniz, ilkini oraya sürükleyin ve sonra gerektiğinde orijinali geri çekin.

örn.

// 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

Bir Image nesnesiyle çağrılan drawImage() 'den daha iyi bir parametre olarak Canvas ile çağrılan drawImage() var mı? argüman olarak? –

+0

Bir tuval ile drawImage() işlevini bir tuvalin bir veri URL'sine dönüştürmekten daha hızlı olacağını hayal edin, sonra bir Görüntü içine yükleyin, ardından o görüntü ile 'drawImage()' öğesini çağırın! – andrewmu

+0

Bir dizide çok sayıda durum depolamanız gerekirse ne olur? Bir grup tuvaller bir dizi oluşturmalı mıyım ?? Örneğin. 'var numBuffers = 20; var tmpCan = document.createElement ('tuval'); var tamponlar = [tmpCan]; (var i = 1, len = numBuffers, i dylnmc

19

o getImageData ve putImageData yöntemleri Reference Ancak putImageData ve getImageData gidecekseniz yapmak için birkaç yol vardır oldukça yavaştır. Başka bir yol ise, verileri bir image belleğe kaydetmek ve daha hızlı olandan hatırlatmak, sonra üçüncü yol ise, bir başka tuval öğesine kopyalamayı içeren andrewmu tarafından belirtilmektedir. Birinci ve ikinci tip için örnekler ekledim.

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

, bunu jsperfed yapan var mı? : D – JustGoscha

+0

@JustGoscha hmm Kimsenin Simon Sarris olacağını düşünmüyorum. – Loktar

1
tuval içine

eklenen görüntü

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

(1) op zaten tuval doldurulmuş; bu yüzden, yükledikten sonra bir resme bir tuvalin içine nasıl yükleneceğini bilmesi gerekmiyor (2), bir tuvalin bir görüntüye nasıl "dönüştürüleceğini" soruyor, o görüntüye bir referans veriyor ve daha sonra tuvaline resim - başkalarının da işaret ettiği gibi - toDataUrl() ==> img.src veya geçici bir tuval kullanılarak mümkündür. Ancak, cevabınız soruyu cevaplamaya gerçekten yaklaşmıyor. Belki insanları karıştırmamak için gözden geçirebilir veya kaldırabilirsiniz. – dylnmc

İlgili konular