web-dev-qa-db-ja.com

HTMLキャンバス要素のサイズを変更する方法は?

幅と高さを持つHTMLで静的に定義されたキャンバス要素があります。 JavaScriptを使用して動的にサイズを変更しようとすると(キャンバスの属性またはスタイルプロパティを介して新しい幅と高さを設定する)、Firefoxで次のエラーが発生します。

キャッチされない例外:[例外... "WrappedNativeプロトタイプオブジェクトに対する不正な操作" nsresult: "0x8057000c(NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JSフレーム:: file:///home/russh/Desktop/test.html :: onclick ::行1 "データ:no]

この要素のサイズを変更することは可能ですか、それとも破棄して新しい要素をその場で作成する必要がありますか?

45
russx2

あなたはあなたのコードを公開しませんでした、そして私はあなたが何か間違ったことをしていると思います。数値を使用して幅と高さの属性を割り当てることにより、サイズを変更することができます。

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

少なくとも私にとってはうまくいきます。文字列(「2cm」、「3in」、「2.5px」など)を割り当てないでください。また、スタイルを混乱させないでください。

実際、これは公開されている知識です。これについては HTMLキャンバスの仕様 ですべて読むことができます。非常に小さく、非常に有益です。これはDOMインターフェース全体です。

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

ご覧のとおり、2つの属性widthheightが定義されており、両方ともunsigned long

63
Eugene Lazutkin

キャンバスが静的に宣言されている場合は、スタイルではなく、widthおよびheight属性を使用する必要があることに注意してくださいeg。これは動作します:

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

しかし、これはnot動作します:

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

私はあなたと同じ問題を抱えていましたが、toDataURLメソッドがわかりました。

その要点は、現在のキャンバスをdataURLに変換し、キャンバスのサイズを変更してから、保存したdataURLからキャンバスに戻したものを描画することです。

だからここに私のコードがあります:

var oldCanvas = canvas.toDataURL("image/png");
var img = new Image();
img.src = oldCanvas;
img.onload = function (){
    canvas.height += 100;
    ctx.drawImage(img, 0, 0);
}
14
john
<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>
5
Jignesh Variya

これはちょうど今私のために働いた:

<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>
4
Kent Brewster

より完全な答えを出すための私の努力はここにあります(@johnの答えに基づいて構築)。

私が遭遇した最初の問題は、キャンバスノードの幅と高さを(スタイルを使用して)変更すると、コンテンツが「ズーム」または「縮小」されることでした。これは望ましい効果ではありませんでした。

したがって、100px x 100pxのキャンバスに任意のサイズの2つの長方形を描画するとします。

<canvas width="100" height="100"></canvas>

長方形がキャンバスのサイズを超えないようにして表示されないようにするには、キャンバスが十分に大きいことを確認する必要があります。

var $canvas = $('canvas'),
    oldCanvas,
    context = $canvas[0].getContext('2d');

function drawRects(x, y, width, height)
{
  if (($canvas.width() < x+width) || $canvas.height() < y+height)
  {
    oldCanvas = $canvas[0].toDataURL("image/png")
    $canvas[0].width = x+width;
    $canvas[0].height = y+height;

    var img = new Image();
    img.src = oldCanvas;
    img.onload = function (){
      context.drawImage(img, 0, 0);
    };
  }
  context.strokeRect(x, y, width, height);
}


drawRects(5,5, 10, 10);
drawRects(15,15, 20, 20);
drawRects(35,35, 40, 40);
drawRects(75, 75, 80, 80);

最後に、このためのjsfiddleを示します。 http://jsfiddle.net/Rka6D/4/ .

1
Gezim

プロトタイプを扱うのは面倒であり、_PROTOエラーの一部と思われるエラーは、たとえばHTMLCanvasElement.prototype.width、おそらくすべてのキャンバスを一度にサイズ変更する試みとして。

提案として、一度に複数のキャンバスのサイズを変更しようとしている場合は、次のことを試すことができます。

<canvas></canvas>
<canvas></canvas>
<canvas></canvas>
<script type="text/javascript">
    ...
</script>

JavaScriptで、プロトタイプを呼び出す代わりに、これを試してください。

$$ = function(){
    return document.querySelectorAll.apply(document,arguments);
}
for(var i in $$('canvas')){
    canvas = $$('canvas')[i];
    canvas.width = canvas.width+100;
    canvas.height = canvas.height+100;
}

これは この例


0
Braden Best