2010-10-08 41 views
9

Şu anda sayfada bir kanvas öğesi olmadan bir çerçeve 2d oluşturma bağlamı oluşturmanın bir yolunu arıyorum. Dinamik olarak bir tuval öğesi oluşturabilir ve gizleyebilirim, ancak yine de görüntüyü istediğim zaman kullanıcıya doğrudan göstermek istemiyorum, bu yüzden sayfada bir tuval öğesi bulundurmanın bir anlamı yok. Yani temel olarak2d bağlamı oluştur * * kanvassız

var image = new Image(); 

benzer ama sadece tuval 2d oluşturma bağlamında (sözde kod) içindir şey arıyorum

var context = new 2dContext(); 

işlevselliği böyle var mı? Böyle bir şey bulamadım. HTML5 spec tarafından render bağlam arayüzünün adı olan

var context = new CanvasRenderingContext2D(); 

çağrılması sadece Firefox'ta bana garip hatalar veriyor:

uncaught exception: [Exception... "Cannot convert WrappedNative to function" nsresult: "0x8057000d (NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN)" location: "JS frame :: http://localhost/ :: <TOP_LEVEL> :: line 25" data: no] 
+1

Bu bağlamın amacı nedir? Bir bağlam kullanmadan ne yapmak istediğinizi başarmanın daha iyi bir yolu olabilir. Bir bağlam kullanmaya karar verdiniz ve ihtiyaç nedir? –

+0

Ben kurulu çizmek için tuval kullanan bir masa oyunu bir tarayıcı tabanlı bir uygulama geliştiriyorum. En önemli özelliklerden biri de, kartın görüntülenme yerinizden daha büyük olmasıdır, bu yüzden etrafta gezinebilmeniz gerekir. Kaydırma, pürüzsüz ve güncel ECMA Komut Dosyası + Tuval uygulamalarına bakmak için çok yüksek yenileme hızları gerektirir. Yalnızca bu performansı sağlamaz. Bu yüzden, tüm panoyu görünmez bir içeriğe çekecek bir arabellek yaklaşımı kullanacaktım, bir şey değiştiğinde ve bu bağlamda görüntülenen içeriğin küçük bölümleri yenileme oranlarını artırmak için (önemli ölçüde). –

+0

Herhangi bir şeye ihtiyacınız yok * çok * fantezi/karmaşık, genellikle aramak yerine HTML kullanarak/kötüye kullanarak, bir SVG çözümü ya da bu konu için 'tuval 'dışında başka bir şey söyle. –

cevap

18

sayfada görüntülemeden bir tuval kullanmak mümkündür. Aşağıdaki yapabilirdi: Eğer tuval kullandıktan sonra

// Create a canvas element 
var canvas = document.createElement('canvas'); 
canvas.width = 500; 
canvas.height = 400; 

// Get the drawing context 
var ctx = canvas.getContext('2d'); 

// Then you can do stuff, e.g.: 
ctx.fillStyle = '#f00'; 
ctx.fillRect(20,10,80,50); 

, elbette belgenin

var element = document.getElementById('canvas_container'); 
element.appendChild(canvas); 

ekleyebilirsiniz Yoksa ondan bir görüntü yapabiliriz:

var new_image_url = canvas.toDataURL(); 
var img = document.createElement('img'); 
img.src = new_image_url; 

Veya ile değerleri gibi tuval verilere erişmek olabilir:

var image_data = ctx.getImageData(0,0,canvas.width,canvas.height); 
var rgba_byte_array = image_data.data; 
rgba_byte_array[0]; // red value for first pixel (top left) in the canvas 
+0

Cevabınız için teşekkür ederiz. Bu yöntemin farkındaydım, ama tam olarak aradığım şey olmadığını hissettim. Muhtemelen bu en iyi bahistir. –

+3

Ne yazık ki bu, kişisel gereksinim olan Web İşçileri için çalışmıyor. DOM'a erişimleri yok, ancak arka plan iş parçacığı üzerinde bazı çizim işlemleri yapmak istiyorum. – Alastair

3

Bir tuval nesnesi oluşturup içeriğini bir değişkende saklarsanız, bu değişkenin tuval nesnesine kendi göstericisine sahip olması ilginçtir. Bir tuval olmadan getContext ("2d") kullanamayacağınız için, sadece bir tuval işaretçiniz olabilir. Eğer benim gibi ve aynı nesneye iki başvuru sahip nefret, bu yapabilirdi:

Orijinal: Artık

var context=document.createElement("canvas").getContext("2d"); 

alert(context.canvas);// The canvas object. 

:

var canvas=document.createElement("canvas"); 
var context=canvas.getContext("2d"); 

alert(Boolean(context.canvas==canvas));// true. 

bahsettiğimi ne Tüm önemli tuval malzemelerini içerik değişkeni ile yapabilirsiniz. Sonuçta, içerik tuval değişkeninden daha sık erişilir.

context.canvas.width=320; 
context.canvas.height=320; 
document.body.appendChild(context.canvas); 

Ve tuval ile rahatsız etmek istemiyorsanız yalnız değişkeni bırakın, yine de kullanmak istedi gibi değil: İhtiyaç yaptığınızda sadece bağlam aracılığıyla başvuru.