61 Stimmen

Wie kann man die Größe eines HTML-Canvas-Elements ändern?

Ich habe ein Canvas-Element statisch in der HTML mit einer Breite und Höhe definiert. Wenn ich versuche, JavaScript zu verwenden, um die Größe dynamisch zu ändern (Einstellung einer neuen Breite und Höhe - entweder auf die Attribute der Leinwand oder über die Stileigenschaften), erhalte ich den folgenden Fehler in Firefox:

Ungefangene Ausnahme: [Exception... "Unzulässige Operation auf WrappedNative-Prototypobjekt" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: file:///home/russh/Desktop/test.html :: onclick :: line 1" data: no]

Ist es möglich, die Größe dieses Elements zu ändern, oder muss ich es zerstören und ein neues Element im Handumdrehen erstellen?

0 Stimmen

Eigentlich sieht die Fehlermeldung so aus, als hätten Sie versucht, die width o height Eigenschaft von HTMLCanvasElement.prototype direkt. Ich habe keine Ahnung, wie das versehentlich geschehen konnte.

0 Stimmen

Schauen Sie sich meine Umsetzung an: stackoverflow.com/a/23128583/1265753

76voto

Eugene Lazutkin Punkte 43092

Sie haben Ihren Code nicht veröffentlicht, und ich vermute, dass Sie etwas falsch machen. Es ist möglich, die Größe zu ändern, indem Sie die Attribute Breite und Höhe mit Zahlen belegen:

canvasNode.width  = 200; // in pixels
canvasNode.height = 100; // in pixels

Zumindest funktioniert es bei mir. Stellen Sie sicher, dass Sie keine Zeichenketten zuweisen (z. B. "2cm", "3in" oder "2.5px"), und nicht mit Stilen herumspielen.

Dies ist ein öffentlich zugängliches Wissen - Sie können alles darüber lesen in die HTML-Canvas-Spezifikation - sie ist sehr klein und ungewöhnlich informativ. Dies ist die gesamte DOM-Schnittstelle:

interface HTMLCanvasElement : HTMLElement {
           attribute unsigned long width;
           attribute unsigned long height;

  DOMString toDataURL();
  DOMString toDataURL(in DOMString type, [Variadic] in any args);

  DOMObject getContext(in DOMString contextId);
};

Wie Sie sehen können, definiert es 2 Attribute width y height und beide sind unsigned long .

41 Stimmen

Hinweis: Wenn Sie die Leinwandgröße ändern, wird die Leinwand scheinbar gelöscht (zumindest in Chrome).

5 Stimmen

Ja. Ich stimme zu. Gibt es eine Möglichkeit, die Größe der Leinwand zu ändern und gleichzeitig die Größe (Skalierung) der Bilder zu ändern, die sich darin befinden?

0 Stimmen

Es wäre hilfreich, ein Beispiel für die Verwendung dieser Funktion auf jsfiddle zu posten.

26voto

sam hocevar Punkte 11517

Beachten Sie, dass Sie, wenn Ihr Canvas statisch deklariert ist, die width y height Attribute, nicht den Stil, z. B. das wird funktionieren:

<canvas id="c" height="100" width="100" style="border:1px"></canvas>
<script>
    document.getElementById('c').width = 200;
</script>

Aber das wird no Arbeit:

<canvas id="c" style="width: 100px; height: 100px; border:1px"></canvas>
<script>
    document.getElementById('c').width = 200;
</script>

15voto

john Punkte 157

Ich hatte gerade das gleiche Problem wie Sie, aber fand heraus, über die toDataURL-Methode, die sich als nützlich erwiesen.

Im Wesentlichen geht es darum, die aktuelle Leinwand in eine dataURL zu verwandeln, die Größe der Leinwand zu ändern und dann das, was Sie hatten, aus der gespeicherten dataURL wieder in Ihre Leinwand zu zeichnen.

Hier ist also mein Code:

var oldCanvas = canvas.toDataURL("image/png");
var img = new Image();
img.src = oldCanvas;
img.onload = function (){
    canvas.height += 100;
    ctx.drawImage(img, 0, 0);
}

6 Stimmen

Ctx.getImageData() und ctx.putImageData() sind leichter und für diese Aufgabe konzipiert.

0 Stimmen

@fuzzyTew Ich bin mir ziemlich sicher, dass die Verwendung von getImageData() y putImageData() ist effizient, kopiert aber Pixel für Pixel und skaliert die alten Bilddaten nicht, während die Verwendung von drawImage() würde eine Skalierung ermöglichen.

0 Stimmen

Warum verwenden toDataUrl ? Dies führt zu einer unnötigen Datenumwandlung (raw=>png). Sie könnten verwenden drawImage stattdessen zweimal.

5voto

Jignesh Variya Punkte 1729
<div id="canvasdiv" style="margin: 5px; height: 100%; width: 100%;">
    <canvas id="mycanvas" style="border: 1px solid red;"></canvas>
</div>
<script>
$(function(){
    InitContext();
});
function InitContext()
{
var $canvasDiv = $('#canvasdiv');

var canvas = document.getElementById("mycanvas");
canvas.height = $canvasDiv.innerHeight();
canvas.width = $canvasDiv.innerWidth();
}
</script>

4voto

Kent Brewster Punkte 2460

Das hat bei mir gerade funktioniert:

<canvas id="c" height="100" width="100" style="border:1px solid red"></canvas>
<script>
var c = document.getElementById('c');
alert(c.height + ' ' + c.width);
c.height = 200;
c.width = 200;
alert(c.height + ' ' + c.width);
</script>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X