এইচটিএমএল 5 ক্যানভাসের প্রস্থ এবং উচ্চতা কীভাবে পাব?


98

আমি কীভাবে জাভাস্ক্রিপ্টে ক্যানভাস উপাদানটির প্রস্থ এবং উচ্চতা পেতে পারি?

এছাড়াও, আমি যে ক্যানভাস সম্পর্কে পড়তে থাকি তার "প্রসঙ্গ" কী?

উত্তর:


128

টিউটোরিয়ালটি দেখার মতো হতে পারে: এমডিএন ক্যানভাস টিউটোরিয়াল

উপাদানের সেই বৈশিষ্ট্যগুলিতে অ্যাক্সেস করে আপনি কেবল ক্যানভাস উপাদানটির প্রস্থ এবং উচ্চতা পেতে পারেন। উদাহরণ স্বরূপ:

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ক্যানভাসের এপিআই হিসাবে ভাবতে পারেন যা আপনাকে এমন কমান্ড সরবরাহ করে যা আপনাকে ক্যানভাস উপাদানটি আঁকতে সক্ষম করে।


মনে রাখবেন যে মজিলা টিউটোরিয়ালটি মূলত এখন ভাঙা লিঙ্কগুলির একগুচ্ছ, দুর্ভাগ্যক্রমে। আশা করি তারা কোনও দিন এটি ঠিক করে দেবে।
জেড

4
এটি ক্রোম 31 এ প্রসঙ্গে ক্যানভাস আকারটি দেয়
shuji

12
এটি কেবল তখনই কাজ করে widthএবং ট্যাগ ট্যাগ heightহিসাবে সরাসরি নির্দিষ্ট করা হয়<canvas />
ভ্লাদক্রাস

4
ওটা সত্যি না. এটি সর্বদা ট্যাগ বৈশিষ্ট্য ছাড়াই এমনকি একটি মান প্রদান করে, এটি ডিফল্ট 300 x 150.
মাইকেল থেরিয়ট

সচেতন থাকুন যে getBoundingClientRect () কখনও কখনও সীমানা অন্তর্ভুক্ত করে। এটি বা তাত্পর্যপূর্ণ হতে পারে না তবে আমার সিএসএসে আমি প্রস্থ এবং উচ্চতা 100,100 এ সেট করেছিলাম এবং getBoundingClientRect 102, 102. ক্লায়েন্টহাইট এবং ক্লায়েন্টউইথ (বা স্ক্রোলহাইট এবং স্ক্রোলউইথ) সঠিকভাবে 100 ফিরিয়ে দেয়।
ডুমগুবার

38

ঠিক আছে, এর আগে সমস্ত উত্তর সম্পূর্ণরূপে সঠিক নয়। প্রধান ব্রাউজারগুলির মধ্যে 2 এই 2 টি বৈশিষ্ট্য সমর্থন করে না (IE তাদের মধ্যে একটি) বা তাদের আলাদাভাবে ব্যবহার করে না।

আরও ভাল সমাধান (বেশিরভাগ ব্রাউজার দ্বারা সমর্থিত, তবে আমি সাফারি চেক করিনি):

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

কমপক্ষে আমি স্ক্রোলউইথ এবং -হাইট এবং মাপ সেট ক্যানভাস.উইথ এবং উচ্চতা যখন এটি পুনরায় আকার দেওয়া হয় তার সাথে সঠিক মান পাই।


আই 99 ক্যানভাস.উইথ এবং উচ্চতা ঠিকঠাক সমর্থন করে বলে মনে হচ্ছে (9 এর পূর্ববর্তী সংস্করণগুলি ক্যানভাসকে মোটেই সমর্থন করে না), আমি কেবল এটি গিয়েছিলাম। আপনি কোন সমস্যায় পড়েছেন? এবং অন্যান্য প্রধান ব্রাউজারটি কোনটি?
thomanski

4
ঠিক আছে, আমি সত্যিই কখনই আইই আপডেট করি না কারণ আমি এটি ব্যবহার করি না। অন্যান্য প্রধান ব্রাউজারটি অপেরা যা পুনরায় আকার দেওয়ার সময় প্রস্থ এবং উচ্চতা আপডেট করে না / দেয় না।
বিটারব্লু

4
ক্যানভাস.উইথথ বা উচ্চতা ক্যানভাসের মোট আকারটি ফিরিয়ে দেয় না, ক্যানভাসের মোট আসল আকার পেতে ক্যানভাস.স্রোলউইথ বা উচ্চতা পছন্দ করে।
জর্দান

4
এটি আমার পক্ষে কাজ করেছে, কিন্তু অন্যান্য উত্তরগুলি তা করেনি। আমি এমন একটি সমাধান খুঁজছিলাম যা বুটস্ট্র্যাপ ব্যবহার করে ক্যানভাস সেট করা থাকলে প্রস্থ এবং উচ্চতা পেতে পারে।
wanderer0810

22

উল্লিখিত উত্তরগুলি 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 টি মাত্রা বিবেচনা করতে হবে।
নাদির

4
এটি নির্বাচিত উত্তর হওয়া উচিত। আপনি যদি কোনও মান নির্দিষ্ট না করে এবং আপেক্ষিক আকার পরিবর্তন (বুটস্ট্র্যাপ ব্যবহার করার সময় ... ইত্যাদি) ব্যবহার না করেন তবে ডাইরেক্ট widthএবং heightকল সর্বদা 300x150 ফেরত আসবে। ধন্যবাদ
mcy

16

কনটেক্সট অবজেক্ট আপনাকে ক্যানভাস চালিত করতে দেয়; আপনি উদাহরণস্বরূপ আয়তক্ষেত্রগুলি আঁকতে পারেন এবং আরও অনেক কিছু।

আপনি যদি প্রস্থ এবং উচ্চতা পেতে চান, আপনি কেবল স্ট্যান্ডার্ড এইচটিএমএল বৈশিষ্ট্য widthএবং ব্যবহার করতে পারেন height:

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

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

4
এই উত্তরটি @ অ্যান্ড্রুমু'র সাথে অনেকটা অভিন্ন এবং আপনি সিএসএসের মাধ্যমে ক্যানভাস আকার দিলে কাজ করবে না। আরও জোরালো সমাধানের জন্য আমার উত্তর দেখুন ।
ড্যান ড্যাসকলেসকু

9

এখন 2015 থেকে শুরু হয়ে সমস্ত (মেজর?) ব্রাউজারগুলি ক্যানভাসের অভ্যন্তরীণ আকারটি মঞ্জুরি দেয় c.widthএবং c.heightপেতে পারে বলে মনে হয় তবে:

উত্তর হিসাবে প্রশ্নটি মিসেলিডিং কারণ ক্যানভাসের নীতিগতভাবে 2 টি পৃথক / স্বতন্ত্র আকার রয়েছে।

"এইচটিএমএল" CSS এর প্রস্থ / উচ্চতা এবং এর নিজস্ব (বৈশিষ্ট্য) প্রস্থ / উচ্চতা বলতে দেয়

বিভিন্ন আকারের এই সংক্ষিপ্ত উদাহরণটি দেখুন , যেখানে আমি 300/100 এইচটিএমএল-উপাদানটিতে 200/200 ক্যানভাস রেখেছি

বেশিরভাগ উদাহরণের সাথে (সমস্ত কিছু আমি দেখেছি) কোনও CSS-আকারের সেট নেই, সুতরাং আপনি (অঙ্কন-) ক্যানভাস আকারের প্রস্থ এবং উচ্চতা ইমপ্লিজিট করুন। তবে এটি আবশ্যক নয় এবং মজাদার ফলাফল আনতে পারে, যদি আপনি ভুল আকার গ্রহণ করেন - যেমন। অভ্যন্তরীণ অবস্থানের জন্য সিএসএস প্রস্থ / উচ্চতা।


0

তাদের কেউই আমার পক্ষে কাজ করেনি। এটা চেষ্টা কর.

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

0

এখানে একটি কোডপেন রয়েছে যা কোনও আকারে কোনও ক্যানভাসকে সঠিকভাবে রেন্ডার করতে ক্যানভাস.হাইট / প্রস্থ, সিএসএস উচ্চতা / প্রস্থ এবং প্রসঙ্গ ব্যবহার করে

এইচটিএমএল:

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

মূলত, ক্যানভাস.হাইট / প্রস্থ আপনাকে যে বিটম্যাপটি উপস্থাপন করছে তার আকার নির্ধারণ করে। সিএসএসের উচ্চতা / প্রস্থের পরে বিন্যাসের জায়গাগুলিতে ফিট করার জন্য বিটম্যাপটি স্কেল করে (প্রায়শই এটি এটিকে স্কেল করে দেওয়ার সাথে সাথে ওয়ারপ করে)। এরপরে প্রসঙ্গটি বিভিন্ন আকারে ভেক্টর ক্রিয়াকলাপগুলি ব্যবহার করে অঙ্কনের জন্য এটির স্কেলটি পরিবর্তন করতে পারে।


-1

আমার সমস্যা ছিল কারণ আমার ক্যানভাসটি আইডি ছাড়াই একটি ধারকটির ভিতরে ছিল তাই আমি নীচে এই জ্যাকোয়ারি কোডটি ব্যবহার করেছি

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

আমি যখন এটি ব্যবহার করি আমি সর্বদা পোস্ট করি .. আমার উত্তরটি হ্রাসকারী প্রতিভাবান কে? জানতে চাই ..
ব্রায়ান সানচেজ

এই ছোট কাজের জন্য জিকুয়েরি একটি বড় নির্ভরতা।
sdgfsdh

আমি ভোট দেওয়া বিকল্পটি চেষ্টা করেছিলাম এবং আমার পক্ষে কাজ করি নি তাই আমি আমার সমাধান পোস্ট করেছিলাম, আপনার যা প্রয়োজন তা কোডিং করার সময় সময়, সময় সোনার তাই জ্যাকুরি কেন ব্যবহার করবেন না ?? .. আকর্ষণীয়, তবে কেন ডাউনওয়োট? ...
ব্রায়ান সানচেজ

4
জিকিউরি একটি ওয়েবসাইটে যথেষ্ট ব্লাট যুক্ত করে। এটি আপনার সময় সাশ্রয় করতে পারে তবে এটি আপনার ব্যবহারকারীদের জন্য পৃষ্ঠাটি ধীর করে দেয়। আপনার এই বাণিজ্য বন্ধ সম্পর্কে সচেতন হওয়া দরকার।
sdgfsdh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.