HTML5 캔버스의 너비와 높이는 어떻게 얻습니까?


94

JavaScript에서 캔버스 요소의 너비와 높이를 어떻게 얻을 수 있습니까?

또한 내가 계속 읽는 캔버스의 "문맥"은 무엇입니까?

답변:


122

튜토리얼을 살펴볼 가치가 있습니다 : Firefox Canvas Tutorial

요소의 속성에 액세스하여 캔버스 요소의 너비와 높이를 얻을 수 있습니다. 예를 들면 :

var canvas = document.getElementById('mycanvas');
var width = canvas.width;
var height = canvas.height;

너비 및 높이 속성이 캔버스 요소에 없으면 기본 300x150 크기가 반환됩니다. 올바른 너비와 높이를 동적으로 얻으려면 다음 코드를 사용하십시오.

const canvasW = canvas.getBoundingClientRect().width;
const canvasH = canvas.getBoundingClientRect().height;

또는 더 짧은 객체 비 구조화 구문을 사용합니다.

const { width, height } = canvas.getBoundingClientRect();

context당신이 그것으로 그릴 수 있도록 캔버스에서 얻을 개체입니다. context캔버스 요소에 그릴 수있는 명령을 제공하는 캔버스에 대한 API로 생각할 수 있습니다 .


불행히도 Mozilla 튜토리얼은 이제 기본적으로 끊어진 링크 모음입니다. 언젠가 고칠 수 있기를 바랍니다.
Sz.

1
Chrome 31에서 컨텍스트 캔버스 크기를 반환합니다.
shuji

12
이 경우에만 작동 widthheight로 직접 지정 <canvas />태그 속성
vladkras

5
그것은 사실이 아닙니다. 항상 150 X 300 불이행, 심지어 태그 속성없이 값을 반환
마이클 테리 옷

getBoundingClientRect ()에는 때때로 테두리가 포함됩니다. 이것은 중요하거나 중요하지 않을 수 있지만 CSS에서 너비와 높이를 100,100으로 설정하고 getBoundingClientRect가 102, 102를 반환합니다. clientHeight 및 clientWidth (또는 scrollHeight 및 scrollWidth)는 100을 올바르게 반환합니다.
DoomGoober

38

글쎄, 이전의 모든 답변이 완전히 정확하지는 않습니다. 주요 브라우저 중 2 개는 이러한 2 개의 속성을 지원하지 않거나 (IE가 그중 하나임) 다르게 사용합니다.

더 나은 솔루션 (대부분의 브라우저에서 지원되지만 Safari는 확인하지 않음) :

var canvas = document.getElementById('mycanvas');
var width = canvas.scrollWidth;
var height = canvas.scrollHeight;

적어도 scrollWidth 및 -Height로 올바른 값을 얻고 크기를 조정할 때 canvas.width 및 height를 설정해야합니다.


IE9는 canvas.width 및 height를 지원하는 것 같습니다 (9 이전 버전은 캔버스를 전혀 지원하지 않음). 방금 시도해 보았습니다. 어떤 문제가 발생 했습니까? 그리고 다른 주요 브라우저는 무엇입니까?
thomanski

1
맞습니다. IE를 사용하지 않기 때문에 IE를 업데이트하지 않습니다. 다른 주요 브라우저는 크기를 조정하는 동안 너비와 높이를 업데이트하지 않았거나 업데이트하지 않은 Opera입니다.
Bitterblue 2013 년

2
canvas.width 또는 height는 캔버스의 전체 크기를 반환하지 않으며, 캔버스의 전체 실제 크기를 얻으려면 canvas.scrollWidth 또는 height를 선호합니다.
요르단

1
이것은 나를 위해 일했지만 다른 답변은 그렇지 않았습니다. 캔버스가 부트 스트랩을 사용하여 설정된 경우 너비와 높이를 얻을 수있는 솔루션을 찾고있었습니다.
wanderer0810

21

언급 된 답변 canvas.width은 캔버스의 내부 크기, 즉 요소를 만들 때 지정된 크기를 반환합니다.

<canvas width="500" height="200">

당신이 CSS와 캔버스 크기를 경우, 그 DOM 치수를 통해 액세스 할 수 있습니다 .scrollWidth.scrollHeight:

var canvasElem = document.querySelector('canvas');
document.querySelector('#dom-dims').innerHTML = 'Canvas DOM element width x height: ' +
      canvasElem.scrollWidth +
      ' x ' +
      canvasElem.scrollHeight

var canvasContext = canvasElem.getContext('2d');
document.querySelector('#internal-dims').innerHTML = 'Canvas internal width x height: ' +
      canvasContext.canvas.width +
      ' x ' +
      canvasContext.canvas.height;

canvasContext.fillStyle = "#00A";
canvasContext.fillText("Distorted", 0, 10);
<p id="dom-dims"></p>
<p id="internal-dims"></p>
<canvas style="width: 100%; height: 123px; border: 1px dashed black">


정답이었습니다. 고려해야 할 2 가지 차원.
디르

2
이것은 선택된 대답이어야합니다. direct widthheightcall은 값을 지정하지 않고 상대적 크기 조정을 사용하는 경우 항상 300x150을 반환합니다 (부트 스트랩 등을 사용하는 동안). 감사.
mcy

16

컨텍스트 개체를 사용하면 캔버스를 조작 할 수 있습니다. 예를 들어 직사각형 등을 그릴 수 있습니다.

당신은 폭과 높이를 얻고 싶은 경우에, 당신은 표준 HTML 속성을 사용할 수 있습니다 widthheight:

var canvas = document.getElementById( 'yourCanvasID' );
var ctx = canvas.getContext( '2d' );

alert( canvas.width );
alert( canvas.height ); 

3
이 답변은 @andrewmu의 답변과 거의 동일하며 CSS를 통해 캔버스 크기를 조정하면 작동하지 않습니다. 더 강력한 솔루션에 대한 내 대답 을 참조하십시오 .
Dan Dascalescu

9

이제 모든 (주요?) 브라우저 ALOW 것 같다 2015 년 시작 c.widthc.height캔버스 얻기 위해 내부를 크기 .

캔버스는 원칙적으로 2 개의 서로 다른 / 독립적 인 크기를 가지고 있기 때문에 대답으로서의 질문은 잘못된 것입니다.

"html"은 CSS 너비 / 높이 및 자체 (속성) 너비 / 높이를 말할 수 있습니다.

다른 크기 조정 에 대한이 짧은 예를 보십시오.200/200 캔버스를 300/100 html 요소에 넣은

대부분의 예제 (내가 본 모든 것)에는 css-size 세트가 없으므로 (drawing-) 캔버스 크기의 너비와 높이를 암시합니다. 그러나 그것은 필수가 아니며 잘못된 크기를 선택하면 재미있는 결과를 얻을 수 있습니다. 내부 위치 지정을위한 css 너비 / 높이.


0

그들 중 어느 것도 나를 위해 일하지 않았습니다. 이 시도.

console.log($(canvasjQueryElement)[0].width)

0

다음은 canvas.height / width, CSS 높이 / 너비 및 컨텍스트를 사용하여 모든 크기의 캔버스를 올바르게 렌더링하는 CodePen입니다. .

HTML :

<button onclick="render()">Render</button>
<canvas id="myCanvas" height="100" width="100" style="object-fit:contain;"></canvas>

CSS :

canvas {
  width: 400px;
  height: 200px;
  border: 1px solid red;
  display: block;
}

자바 스크립트 :

const myCanvas = document.getElementById("myCanvas");
const originalHeight = myCanvas.height;
const originalWidth = myCanvas.width;
render();
function render() {
  let dimensions = getObjectFitSize(
    true,
    myCanvas.clientWidth,
    myCanvas.clientHeight,
    myCanvas.width,
    myCanvas.height
  );
  myCanvas.width = dimensions.width;
  myCanvas.height = dimensions.height;

  let ctx = myCanvas.getContext("2d");
  let ratio = Math.min(
    myCanvas.clientWidth / originalWidth,
    myCanvas.clientHeight / originalHeight
  );
  ctx.scale(ratio, ratio); //adjust this!
  ctx.beginPath();
  ctx.arc(50, 50, 50, 0, 2 * Math.PI);
  ctx.stroke();
}

// adapted from: https://www.npmjs.com/package/intrinsic-scale
function getObjectFitSize(
  contains /* true = contain, false = cover */,
  containerWidth,
  containerHeight,
  width,
  height
) {
  var doRatio = width / height;
  var cRatio = containerWidth / containerHeight;
  var targetWidth = 0;
  var targetHeight = 0;
  var test = contains ? doRatio > cRatio : doRatio < cRatio;

  if (test) {
    targetWidth = containerWidth;
    targetHeight = targetWidth / doRatio;
  } else {
    targetHeight = containerHeight;
    targetWidth = targetHeight * doRatio;
  }

  return {
    width: targetWidth,
    height: targetHeight,
    x: (containerWidth - targetWidth) / 2,
    y: (containerHeight - targetHeight) / 2
  };
}

기본적으로 canvas.height / width는 렌더링 할 비트 맵의 ​​크기를 설정합니다. 그런 다음 CSS 높이 / 너비는 레이아웃 공간에 맞게 비트 맵의 ​​크기를 조정합니다 (종종 크기를 조정할 때 뒤틀림). 그런 다음 컨텍스트는 벡터 작업을 사용하여 다양한 크기로 그릴 배율을 수정할 수 있습니다.


-1

내 캔버스가 ID가없는 컨테이너 내부에 있었기 때문에 문제가 있었으므로 아래 jquery 코드를 사용했습니다.

$('.cropArea canvas').width()

나는 항상 그것을 사용할 때 게시합니다 .. 내 대답을 반대하는 천재는 누구입니까? 알고 싶니..
Brian Sanchez

JQuery는이 작은 작업에 큰 의존성입니다.
sdgfsdh 2010 년

나는 투표 옵션을 시도했지만 나를 위해 일하지 않았기 때문에 내 솔루션을 게시했습니다. 코딩 할 때 필요한 것은 시간, 시간은 금이므로 jquery를 사용하지 않는 이유는 무엇입니까 ?? .. 흥미 롭습니다. 그렇다면 왜 반대 투표를해야합니까? ...
Brian Sanchez

1
JQuery는 웹 사이트에 상당한 팽창을 추가합니다. 시간을 절약 할 수 있지만 사용자의 페이지 속도가 느려집니다. 이 장단점을 알고 있어야합니다.
sdgfsdh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.