मुझे HTML5 कैनवास की चौड़ाई और ऊंचाई कैसे मिलती है?


95

मैं जावास्क्रिप्ट में कैनवास तत्व की चौड़ाई और ऊंचाई कैसे प्राप्त कर सकता हूं?

इसके अलावा, मैं जिस कैनवास के बारे में पढ़ता हूं, उसका "संदर्भ" क्या है?

जवाबों:


122

यह एक ट्यूटोरियल देखने लायक हो सकता है: फ़ायरफ़ॉक्स कैनवास ट्यूटोरियल

आप तत्व के उन गुणों का उपयोग करके एक कैनवास तत्व की चौड़ाई और ऊंचाई प्राप्त कर सकते हैं। उदाहरण के लिए:

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कैनवास के एपीआई के रूप में सोच सकते हैं , जो आपको कमांड के साथ प्रदान करता है जो आपको कैनवास तत्व पर आकर्षित करने में सक्षम बनाता है।


ध्यान दें कि मोज़िला ट्यूटोरियल मूल रूप से अब टूटे हुए लिंक का एक गुच्छा है, दुर्भाग्य से। आशा है कि वे इसे किसी दिन ठीक कर लेंगे।
एस.जे.

1
यह क्रोम 31 में संदर्भ कैनवास का आकार लौटाता है।
4

12
यह कार्य तभी काम करता है widthऔर heightके रूप में सीधे निर्दिष्ट कर रहे हैं <canvas />टैग गुण
vladkras

5
वह सत्य नहीं है। यह हमेशा टैग विशेषताओं के बिना भी एक मान लौटाता है, 300 x 150 के लिए डिफ़ॉल्ट।
माइकल थेरॉट

ध्यान रखें कि getBoundingClientRect () में कभी-कभी सीमाएँ शामिल होती हैं। यह बात हो भी सकती है और नहीं भी, लेकिन मेरे CSS में मैंने चौड़ाई और ऊँचाई 100,100 पर सेट की है और getBoundingClientRect 102, 102. क्लाइंटहाइट और क्लाइंटविड (या स्क्रॉलहाइट और स्क्रॉलविथ) पर 100 सही रिटर्न देता है।
डूमेसेबर्ट

38

इससे पहले, सभी उत्तर पूरी तरह से सही नहीं हैं। 2 प्रमुख ब्राउज़र उन 2 गुणों का समर्थन नहीं करते (IE उनमें से एक है) या उन्हें अलग तरह से उपयोग करते हैं।

बेहतर समाधान (अधिकांश ब्राउज़रों द्वारा समर्थित, लेकिन मैंने सफारी की जांच नहीं की):

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

कम से कम मुझे स्क्रॉलविद और -हाइट और MUST सेट कैनवस के साथ सही मान मिलते हैं। जब इसे आकार दिया जाता है तो इसकी ऊंचाई और ऊंचाई निर्धारित होती है।


IE9 कैनवस का समर्थन करने लगता है। ऊंचाई और ऊंचाई ठीक है (9 से पहले के संस्करण बिल्कुल भी कैनवस का समर्थन नहीं करते थे), मैंने इसे अभी दिया है। आप किन परेशानियों में भागे? और अन्य प्रमुख ब्राउज़र कौन सा है?
थोमांस्की

1
ठीक है, मैं वास्तव में कभी IE को अपडेट नहीं करता हूं क्योंकि मैं इसका उपयोग नहीं करता हूं। अन्य प्रमुख ब्राउज़र ओपेरा है जो आकार परिवर्तन करते समय चौड़ाई और ऊंचाई को अद्यतन नहीं करता है।
बिटरब्लू

2
कैनवस की उपलब्धता या ऊंचाई कैनवस के कुल आकार को वापस नहीं करते हैं, कैनवास के कुल वास्तविक आकार को प्राप्त करने के लिए कैनवस पर क्लिक करें। कैनवास या ऊंचाई।
जॉर्डन

1
यह मेरे लिए काम किया, लेकिन अन्य जवाब नहीं था। मैं एक ऐसे समाधान की तलाश कर रहा था जो अगर बूटस्ट्रैप का उपयोग करके कैनवास सेट किया गया था तो चौड़ाई और ऊंचाई प्राप्त कर सकता है।
wanderer0810

21

canvas.widthकैनवास के आंतरिक आयामों का उल्लेख करने वाले उत्तर , जो तत्व बनाते समय निर्दिष्ट होते हैं:

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

यदि आप सीएसएस के साथ कैनवास का आकार देते हैं, तो इसके 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
यह चयनित उत्तर होना चाहिए। यदि आप कोई मान निर्दिष्ट नहीं करते हैं और सापेक्ष आकार (बूटस्ट्रैप का उपयोग करते समय ... आदि) का उपयोग करते हैं तो डायरेक्ट widthऔर heightकॉल हमेशा 300x150 वापस आ जाएगी। धन्यवाद।
मर्सी

16

संदर्भ ऑब्जेक्ट आपको कैनवास में हेरफेर करने की अनुमति देता है; आप उदाहरण के लिए आयतों को आकर्षित कर सकते हैं और बहुत कुछ।

यदि आप चौड़ाई और ऊंचाई प्राप्त करना चाहते हैं, तो आप मानक HTML विशेषताओं का उपयोग कर सकते हैं widthऔर height:

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

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

3
यह उत्तर बहुत हद तक @ andrewmu के समान है और यदि आप CSS के माध्यम से कैनवास को आकार देते हैं तो यह काम नहीं करेगा। अधिक मजबूत समाधान के लिए मेरा जवाब देखें ।
डैन डस्केल्सस्कु

9

अब 2015 सभी (प्रमुख?) ब्राउज़रों को शुरू करना c.widthऔर c.heightकैनवास को आंतरिक आकार प्राप्त करना प्रतीत होता है , लेकिन:

सवाल जवाब के रूप में याद कर रहे हैं, क्योंकि एक कैनवास सिद्धांत 2 अलग / स्वतंत्र आकार में है।

"Html" सीएसएस चौड़ाई / ऊंचाई और अपनी खुद की (विशेषता-) चौड़ाई / ऊंचाई कहने देता है

विभिन्न आकार के इस संक्षिप्त उदाहरण को देखें , जहां मैंने 300/200 html-एलिमेंट में 200/200 कैनवस डाला

अधिकांश उदाहरणों के साथ (सभी मैंने देखा) कोई सीएसएस-आकार का सेट नहीं है, इसलिए वे स्पष्ट रूप से (ड्राइंग-) कैनवास के आकार की चौड़ाई और ऊंचाई प्राप्त करते हैं। लेकिन यह एक जरूरी नहीं है, और यदि आप गलत आकार लेते हैं, तो यह मजेदार परिणाम दे सकता है - यानी। आंतरिक स्थिति के लिए सीएसएस विधुत / ऊँचाई।


0

उनमें से किसी ने मेरे लिए काम नहीं किया। इसे इस्तेमाल करे।

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

0

यहां एक CodePen है जो किसी भी आकार में किसी भी कैनवास को सही ढंग से प्रस्तुत करने के लिए कैनवस / ऊंचाई / चौड़ाई, CSS ऊंचाई / चौड़ाई और संदर्भ का उपयोग करता है

HTML:

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

सीएसएस:

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

असल में, कैनवस.हाइट / चौड़ाई उस बिटमैप के आकार को सेट करता है जिसे आप प्रस्तुत कर रहे हैं। CSS ऊँचाई / चौड़ाई तो लेआउट स्थान को फिट करने के लिए बिटमैप को मापता है (अक्सर इसे तराजू के रूप में इसे ताना जाता है)। यह संदर्भ विभिन्न आकारों में वेक्टर ऑपरेशन का उपयोग करके, इसे आकर्षित करने के पैमाने को संशोधित कर सकता है।


-1

मुझे एक समस्या थी क्योंकि मेरा कैनवास आईडी के बिना एक कंटेनर के अंदर था इसलिए मैंने नीचे इस jquery कोड का उपयोग किया

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

मैं हमेशा पोस्ट करता हूं जब मैं इसका इस्तेमाल करता हूं .. जो मेरे जवाब को गलत साबित कर रहा है? जानना चाहेंगे ..
ब्रायन सांचेज़

JQuery इस छोटे से कार्य के लिए एक बड़ी निर्भरता है।
sdgfsdh

मैंने मतदान विकल्प की कोशिश की और मेरे लिए काम नहीं किया, इसलिए मैंने अपना समाधान पोस्ट किया, जब कोडिंग की आपको समय की आवश्यकता है, तो समय सोने का है इसलिए jquery का उपयोग क्यों नहीं किया जाता है .. दिलचस्प है, फिर डाउनवोट क्यों? ...
ब्रायन सांचेज़

1
JQuery एक वेबसाइट पर काफी ब्लोट जोड़ता है। यह आपका समय बचा सकता है, लेकिन यह आपके उपयोगकर्ताओं के लिए पेज को धीमा कर देता है। आपको इस व्यापार बंद के बारे में पता होना चाहिए।
sdgfsdh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.