2010-05-23 9 views
22

Mam następujący fragment kodu HTML:Jak uniknąć HTML Canvas auto rozciąganie

<style type="text/css"> 
    #c{width:200px;height:500px} 
</style> 
<canvas id="c"></canvas> 
<script type="text/javascript"> 
    var i = new Image(); 
    i.onload = function() { 
     var ctx = document.getElementById('c').getContext('2d'); 
     ctx.drawImage(i, 0, 0); 
    } 
    i.width = i.height = 20; // actual size of square.png 
    i.src = 'square.png'; 
</script> 

Kwestia jest taka, że ​​rysowane obrazu jest automatycznie rozciągnięte (zmieniony) proporcjonalnie do wielkości płótna. Próbowałem używać wszystkich dostępnych parametrów (drawImage(i, 0, 0, 20, 20, 0, 0, 20, 20)) i to nie pomogło.

Co powoduje rozciąganie mojego rysunku i jak mogę temu zapobiec?

Dzięki,
Tom

+4

Znalazłem swoją odpowiedź http://stackoverflow.com/questions/2588181/canvas-is-stretch-when-using-css-but-normal-with-old-width-and-height-propert – Tom

+0

Promuj swój komentarz do realnego odpowiedz na dobre następnej osobie, która przyjdzie szukać, a ja dam ci ciasteczko (lub uprowadzenie, cokolwiek Mam na sobie). – msw

Odpowiedz

33

Musisz się width i height atrybuty elementu canvas. Określają one współrzędną obszaru roboczego. Wygląda na to, że domyślnie jest to płótno o proporcji 2: 1, które Twój CSS jest przekrzywiony do kwadratu.

23

Warto zauważyć, że szerokość i wysokość atrybuty płótnie są nie jak starej szkoły <img> szerokość i wysokość atrybutów. Nie zastępują CSS. Określają one liczbę pikseli, które powinien mieć bufor pikseli w samym płótnie, a jeśli nie zostanie zastosowany do niego rozmiar z css, css będzie implikować jego rozmiar z tego kształtu tego bufora pikseli. Ustawienie rozmiaru elementu w css nie ustawia rozmiaru bufora pikseli - zmienia jego rozmiar. Z perspektywy CSS, < płótno > to zupełnie to samo, co <img>.

+1

Świetna odpowiedź, dzięki. –

7

Jeśli używasz JQuery, nie powinieneś ustawiać CSS (jak wyżej wspomniani komentatorzy). Trzeba ustawić atrybut tak:

$("canvas").attr('width', aWidth); 
$("canvas").attr('height', aHeight); 

działa świetnie.

8

OK, nieco prostszy (i lżejszy) niż JQuery jest ... JAVASCRIP sam oczywiście!

Jeśli trzeba zmienić dynamicznie swoje płótno wymiary, wystarczy użyć:

document.getElementById('yourcanvasid').setAttribute('width', aWidth); 
document.getElementById('yourcanvasid').setAttribute('height', aHeight); 
+0

document.getElementById ('yourcanvasid'). Width = aWidth robi to również –

0

I łatwiej było po prostu umieścić pętlę czekając na limit czasu w moim pętli animacji, na przykład:

function animate() { 
    c.clearRect(0, 0, window.innerWidth, window.innerHeight); 
    ryuji.draw(); 
    ryuji.update(); 
    let now = Date.now(); 
    then = now + (1000/fps); 
    while (Date.now() < then) { 

    } 
    requestAnimationFrame(animate); 
}