Bagaimana cara mendapatkan lebar dan tinggi kanvas HTML5?

95

Bagaimana saya bisa mendapatkan lebar dan tinggi elemen kanvas di JavaScript?

Juga, apa "konteks" dari kanvas yang terus saya baca?

penjepit
sumber

Jawaban:

122

Mungkin ada baiknya melihat tutorial: Tutorial Kanvas Firefox

Anda bisa mendapatkan lebar dan tinggi elemen kanvas hanya dengan mengakses properti elemen tersebut. Sebagai contoh:

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

Jika atribut width dan height tidak ada dalam elemen kanvas, ukuran default 300x150 akan dikembalikan. Untuk mendapatkan lebar dan tinggi yang benar secara dinamis gunakan kode berikut:

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

Atau menggunakan sintaks penghancur objek yang lebih pendek:

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

Ini contextadalah objek yang Anda dapatkan dari kanvas untuk memungkinkan Anda menggambar ke dalamnya. Anda bisa menganggapnya contextsebagai API ke kanvas, yang memberi Anda perintah yang memungkinkan Anda menggambar di elemen kanvas.

andrewmu
sumber
Perhatikan bahwa tutorial Mozilla pada dasarnya adalah sekumpulan tautan rusak sekarang, sayangnya. Semoga mereka akan memperbaikinya suatu hari nanti.
Sz.
1
Ini mengembalikan ukuran kanvas konteks di Chrome 31.
shuji
12
ini hanya berfungsi jika widthdan heightditentukan secara langsung sebagai <canvas />atribut tag
vladkras
5
Itu tidak benar. Itu selalu mengembalikan nilai bahkan tanpa atribut tag, default ke 300 x 150.
Michael Theriot
Ketahuilah bahwa getBoundingClientRect () terkadang menyertakan batas. Ini mungkin atau mungkin tidak masalah, tetapi di CSS saya, saya mengatur lebar dan tinggi ke 100.100 dan getBoundingClientRect mengembalikan 102, 102. clientHeight dan clientWidth (atau scrollHeight dan scrollWidth) mengembalikan 100 dengan benar.
DoomGoober
38

Nah, semua jawaban sebelumnya tidak sepenuhnya benar. 2 dari browser utama tidak mendukung 2 properti tersebut (IE adalah salah satunya) atau menggunakannya secara berbeda.

Solusi yang lebih baik (didukung oleh sebagian besar browser, tetapi saya tidak memeriksa Safari):

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

Setidaknya saya mendapatkan nilai yang benar dengan scrollWidth dan -Height dan HARUS mengatur canvas.width dan height saat ukurannya diubah.

Bitterblue
sumber
IE9 tampaknya mendukung canvas.width dan height baik-baik saja (versi sebelum 9 tidak mendukung kanvas sama sekali), saya baru saja mencobanya. Masalah apa yang Anda hadapi? Dan manakah browser utama lainnya?
thomanski
1
Benar, saya benar-benar tidak pernah memperbarui IE karena saya tidak menggunakannya. Browser utama lainnya adalah Opera yang tidak / tidak memperbarui lebar dan tinggi saat mengubah ukuran.
Bitterblue
2
canvas.width atau height tidak mengembalikan ukuran total kanvas, lebih memilih canvas.scrollWidth atau height untuk mendapatkan ukuran sebenarnya dari kanvas.
Yordania
1
Ini berhasil untuk saya, tetapi jawaban yang lain tidak. Saya mencari solusi yang bisa mendapatkan lebar dan tinggi jika kanvas diatur menggunakan bootstrap.
wanderer0810
21

Jawaban yang menyebutkan canvas.widthmengembalikan dimensi internal kanvas, yaitu yang ditentukan saat membuat elemen:

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

Jika Anda mengukur kanvas dengan CSS, dimensi DOM-nya dapat diakses melalui .scrollWidthdan .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">

Dan Dascalescu
sumber
itulah jawaban yang benar. 2 dimensi untuk dipertimbangkan.
Nadir
2
ini harus menjadi jawaban yang dipilih. direct widthdan heightcall akan selalu mengembalikan 300x150 jika Anda tidak menentukan nilai apa pun dan menggunakan ukuran relatif (saat menggunakan bootstrap ... dll). Terima kasih.
mcy
16

Objek konteks memungkinkan Anda untuk memanipulasi kanvas; Anda bisa menggambar persegi panjang misalnya dan banyak lagi.

Jika Anda ingin mendapatkan lebar dan tinggi, Anda cukup menggunakan atribut HTML standar widthdan height:

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

alert( canvas.width );
alert( canvas.height ); 
Harmen
sumber
3
Jawaban ini sangat identik dengan @ andrewmu's dan tidak akan berfungsi jika Anda mengukur kanvas melalui CSS. Lihat jawaban saya untuk solusi yang lebih kuat.
Dan Dascalescu
9

sekarang mulai tahun 2015 semua browser (utama?) tampaknya rendah c.widthdan c.heightmendapatkan ukuran internal kanvas , tetapi:

pertanyaan sebagai jawaban menyesatkan, karena kanvas pada prinsipnya memiliki 2 ukuran berbeda / independen.

"Html" katakanlah lebar / tinggi CSS dan lebar / tingginya (atribut-)

lihat contoh singkat tentang ukuran yang berbeda ini , di mana saya meletakkan kanvas 200/200 ke dalam elemen 300/100 html

Dengan sebagian besar contoh (semua yang saya lihat) tidak ada set ukuran css, jadi ini mengimplikasikan lebar dan tinggi dari ukuran kanvas (gambar-). Tetapi itu bukanlah suatu keharusan, dan dapat menghasilkan hasil yang lucu, jika Anda mengambil ukuran yang salah - mis. css widht / height untuk posisi dalam.

halfbit
sumber
0

Tidak ada yang berhasil untuk saya. Coba ini.

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

Berikut adalah CodePen yang menggunakan canvas.height / width, CSS height / width, dan konteks untuk merender kanvas dengan benar dalam ukuran berapa pun .

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

Javascript:

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

Pada dasarnya, canvas.height / width mengatur ukuran bitmap yang Anda render. Tinggi / lebar CSS kemudian menskalakan bitmap agar sesuai dengan ruang tata letak (sering kali membelokkannya saat menskalakannya). Konteks kemudian dapat memodifikasi skalanya untuk digambar, menggunakan operasi vektor, pada ukuran yang berbeda.

DoomGoober
sumber
-1

Saya mengalami masalah karena kanvas saya berada di dalam wadah tanpa ID jadi saya menggunakan kode jquery di bawah ini

$('.cropArea canvas').width()
Brian Sanchez
sumber
Saya selalu memposting ketika saya menggunakannya .. siapa jenius yang menurunkan jawaban saya? ingin tahu ..
Brian Sanchez
JQuery adalah ketergantungan besar untuk tugas kecil ini.
sdgfsdh
Saya mencoba opsi yang dipilih dan tidak berhasil untuk saya jadi saya memposting solusi saya, ketika mengkodekan apa yang Anda butuhkan adalah waktu, waktu adalah emas jadi mengapa tidak menggunakan jquery ?? .. menarik, lalu mengapa downvote? ...
Brian Sanchez
1
JQuery menambahkan pembengkakan yang cukup besar ke situs web. Ini mungkin menghemat waktu Anda, tetapi memperlambat halaman untuk pengguna Anda. Anda perlu menyadari trade-off ini.
sdgfsdh