2010-10-08 17 views
9

Obecnie poszukuję sposobu na utworzenie kontekstu renderowania kanwy 2d bez konieczności posiadania elementu canvas na stronie. Mógłbym dynamicznie utworzyć element canvas i ukryć go, ale potem znowu nie chcę wyświetlać obrazu bezpośrednio użytkownikowi, więc nie ma sensu, aby element canvas był na stronie. Więc jestem w zasadzie patrząc na coś, co jest podobne doUtwórz kontekst 2d * bez * canvas

var image = new Image(); 

ale tylko na płótno 2d kontekstu renderowania (pseudo kodu)

var context = new 2dContext(); 

Czy istnieje funkcjonalność jak to? Nie mogłem znaleźć czegoś takiego. Wywołanie

var context = new CanvasRenderingContext2D(); 

który jest nazwą renderowania interfejsu kontekstowego według specyfikacji HTML5 po prostu daje mi błędy niewygodnych Firefox:

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

Jaki jest sens kontekstu? może istnieć lepszy sposób na osiągnięcie tego, co chcesz zrobić bez użycia kontekstu. co sprawiło, że zdecydowałeś się użyć kontekstu i jaka jest potrzeba? –

+0

Opracowuję opartą na przeglądarce implementację gry planszowej, która wykorzystuje płótno do rysowania jej planszy. Ważną cechą jest to, że plansza jest w rzeczywistości większa od widocznego na ekranie, więc musisz mieć możliwość przesuwania. Przesuwanie wymaga bardzo wysokich częstotliwości odświeżania, aby wyglądać gładko, a bieżące implementacje skryptów ECMA + Canvas nie zapewniają tej wydajności. Tak więc zamierzałem zastosować podejście buforujące, które narysowałoby całą tablicę do niewidocznego kontekstu, gdy coś zmieni się i przyciśnie części tego kontekstu do płótna widoku, aby (dramatycznie) zwiększyć częstotliwość odświeżania. –

+0

Jeśli nie potrzebujesz niczego * również * fantazyjnego/złożonego, możesz na ogół uciec się do używania/nadużywania HTML zamiast szukać, powiedzmy, rozwiązania SVG lub czegoś innego niż "płótno" w tej sprawie. –

Odpowiedz

18

Jest możliwe użycie płótna bez wyświetlania go na stronie. Można wykonać następujące czynności:

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

Po stosować płótno, można oczywiście dodać go do dokumentu

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

Albo można zrobić zdjęcie z nim:

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

Albo można uzyskać dostęp do danych z płótna jako wartości:

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

Dziękuję za odpowiedź. Byłem świadomy tej metody, ale czułem, że nie jest to dokładnie to, czego szukałem. Prawdopodobnie jest to mój najlepszy zakład. –

+3

Niestety, to nie działa wewnątrz WebWorkers, co jest moją osobistą potrzebą. Nie mają dostępu do DOM, ale chcę wykonać pewne operacje rysowania na wątku tła. – Alastair

3

Co ciekawe, jeśli utworzysz obiekt canvas i zapiszesz jego kontekst w zmiennej, ta zmienna ma swój własny wskaźnik do obiektu canvas. Ponieważ nie można używać getContext ("2d") bez płótna, równie dobrze można mieć tylko jeden wskaźnik canvas. Jeśli jesteś podobny do mnie i nienawidzę posiadające dwa odwołania do tego samego obiektu, można to zrobić:

oryginalny:

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

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

Co mówię:

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

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

teraz możesz zrobić wszystkie ważne rzeczy na płótnie za pomocą zmiennej kontekstowej. W końcu kontekst jest dostępny częściej niż zmienna canvas. Kiedy trzeba go po prostu odwoływać poprzez kontekście:

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

A jeśli nie chcesz męczyć się z płótna po prostu zostawić zmienną sam, to nie jest tak, jak chcesz go używać w każdym razie.

0

Co powiesz na: OffscreenCanvas()?

Odpowiedź brzmi prawdopodobnie nie, ponieważ obecnie jest obsługiwana tylko w Firefoksie 44.0+.

var offscreen = new OffscreenCanvas(256, 256); 

https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas

https://html.spec.whatwg.org/multipage/scripting.html#the-offscreencanvas-interface

(Dodano odniesienie tutaj, ponieważ może to dobrze być nowym spec od tego pytano więcej niż 6 lat temu! I mam nadzieję, że będzie bardziej powszechnie przyjętym)