পুনরায় আঁকার জন্য ক্যানভাস কীভাবে সাফ করবেন


1012

যৌগিক ক্রিয়াকলাপ নিয়ে পরীক্ষার পরে এবং ক্যানভাসে চিত্র অঙ্কন করার পরে আমি এখন চিত্রগুলি এবং কম্পোজিটিং অপসারণের চেষ্টা করছি। আমি এটা কিভাবে করবো?

অন্যান্য চিত্রগুলি পুনরায় আঁকার জন্য আমার ক্যানভাসটি সাফ করা দরকার; এটি কিছু সময়ের জন্য যেতে পারে তাই আমি মনে করি না প্রতিবার একটি নতুন আয়তক্ষেত্র আঁকাই সবচেয়ে কার্যকর বিকল্প হবে।

উত্তর:


1292
const context = canvas.getContext('2d');

context.clearRect(0, 0, canvas.width, canvas.height);

42
নোট করুন যে clearRectআপনার জন্য হয় একটি অপরিকল্পিত প্রসঙ্গ থাকতে হবে, বা আপনার আসল সীমানা ট্র্যাক করা উচিত।
ফ্রেগজ 22

7
আরও নোট করুন যে ক্যানভাসের প্রস্থকে সেট করার জন্য ক) এটিকে অন্য কোনও মানে সেট করা দরকার এবং তারপরে আবার ওয়েবকিটের সামঞ্জস্যের জন্য ফিরে আসা দরকার এবং খ) এটি আপনার প্রসঙ্গে রূপান্তরটি পুনরায় সেট করবে ।
ফ্রোগজ

45
প্রস্থের কৌশলটি ব্যবহার করবেন না। এটি একটি নোংরা হ্যাক। জাভাস্ক্রিপ্টের মতো একটি উচ্চ স্তরের ভাষায় আপনি যা চান তা হ'ল আপনার উদ্দেশ্যগুলি সর্বোত্তমভাবে বর্ণনা করা এবং তারপরে নিম্ন স্তরের কোড সেগুলি পূরণ করতে দিন। প্রস্থটি নিজেই সেট করা আপনার আসল উদ্দেশ্যটি বর্ণনা করে না , যা ক্যানভাস পরিষ্কার করা।
অ্যান্ড্রুর্ক

22
একটি সম্পূর্ণ নাবালক পরামর্শ দিচ্ছি তবে আমি পরামর্শ দেব context.clearRect(0, 0, context.canvas.width, context.canvas.height)। এটি কার্যকরভাবে একই জিনিস তবে একটি কম নির্ভরতা (2 পরিবর্তে 1 ভেরিয়েবল)
gman

6
এই উত্তরটির আরও সাম্প্রতিক পাঠকদের জন্য: সচেতন থাকুন যে এই উত্তরটি সংশোধন করা হয়েছিল এবং উপরের কিছু মন্তব্য আর প্রয়োগ করা হয়নি
দাভস্লব

719

ব্যবহার করুন: context.clearRect(0, 0, canvas.width, canvas.height);

পুরো ক্যানভাসটি সাফ করার জন্য এটি দ্রুত এবং সর্বাধিক বর্ণনামূলক উপায়।

ব্যবহার করবেন না: canvas.width = canvas.width;

রিসেট canvas.widthরিসেট সব ক্যানভাস রাষ্ট্র (যেমন রূপান্তরের, lineWidth, strokeStyle, ইত্যাদি), এটা খুবই ধীর (clearRect তুলনায়) হল, এটা সব ব্রাউজারে কাজ করে না, এবং এটি বর্ণনা করেন না যে আপনি আসলে কি করার চেষ্টা করছেন কি।

রুপান্তরিত স্থানাঙ্কের সাথে কাজ করে

আপনি রূপান্তর ম্যাট্রিক্স সংশোধন করেছেন (যেমন ব্যবহার scale, rotateঅথবা translate) তাহলে context.clearRect(0,0,canvas.width,canvas.height)সম্ভবত ক্যানভাস সমগ্র প্রোফাইল অংশ পরিষ্কার করা হবে না।

সমাধান? ক্যানভাস সাফ করার আগে রূপান্তর ম্যাট্রিক্সটি পুনরায় সেট করুন:

// Store the current transformation matrix
context.save();

// Use the identity matrix while clearing the canvas
context.setTransform(1, 0, 0, 1, 0, 0);
context.clearRect(0, 0, canvas.width, canvas.height);

// Restore the transform
context.restore();

সম্পাদনা: আমি সবেমাত্র কিছু প্রোফাইলিং করেছি এবং (ক্রোমে) রূপান্তরটি পুনরায় সেট না করে 300x150 (ডিফল্ট আকার) ক্যানভাসটি সাফ করা প্রায় 10% দ্রুত। আপনার ক্যানভাসের আকার বাড়ার সাথে সাথে এই পার্থক্যটি হ্রাস পাবে।

এটি ইতিমধ্যে তুলনামূলকভাবে তুচ্ছ, তবে বেশিরভাগ ক্ষেত্রে আপনি সাফ করার চেয়ে আপনি যথেষ্ট পরিমাণে আঁকবেন এবং আমি বিশ্বাস করি যে এই পারফরম্যান্সের পার্থক্য অপ্রাসঙ্গিক be

100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear

4
@ ইউয়াম ইয়ুম: পরিষ্কার () একটি স্ট্যান্ডার্ড ফাংশন? বলে মনে হয় না।
নবার

7
নোট করুন যে পরিবর্তে canvasব্যবহার করে আপনি স্থানীয় ভেরিয়েবলের প্রয়োজনীয়তা সরাতে পারেন ctx.canvas
ড্র নোকস

1
@ ড্র্রুনোকস, ভাল পয়েন্ট, তবে আমি প্রায় সবসময় গতির উদ্দেশ্যে পৃথক ভেরিয়েবলগুলি বেছে নিই। এটি অত্যন্ত সামান্য, তবে আমি ঘন ঘন ব্যবহৃত বৈশিষ্ট্যগুলি (বিশেষত একটি অ্যানিমেশন লুপের অভ্যন্তরে) aliasing করে সময়কে ডিফেরেন্সিং এড়াতে চেষ্টা করি।
Prestaul

ভাঙা চিত্রের লিঙ্কের কারণে আলেকজান্ডারএন এর ডেমো আর কাজ করেনি, স্থির: jsfiddle.net/Ktqfs/50
ডমিনো

আরেকটি উপায় রূপান্তর ম্যাট্রিক্স পরিবর্তনের ঘটনা সমগ্র ক্যানভাস পরিষ্কার কেবল রূপান্তরের ট্র্যাক রাখতে এবং তাদের নিজের ক্ষেত্রে প্রযোজ্য হয় canvas.widthএবং canvas.heightযখন ক্লিয়ারিং। ট্রান্সফর্মটি পুনরায় সেট করার তুলনায় রানটাইম পার্থক্যের জন্য আমি কোনও সংখ্যাসূচক বিশ্লেষণ করিনি, তবে আমার সন্দেহ হয় যে এটি কিছুটা আরও ভাল পারফরম্যান্স অর্জন করবে।
ন্যানো উইজার্ড

226

আপনি যদি লাইন আঁকেন তবে নিশ্চিত হন যে আপনি ভুলে যাবেন না:

context.beginPath();

অন্যথায় লাইনগুলি সাফ হবে না।


10
আমি জানি এটি এখানে কিছুকাল হয়েছে এবং সম্ভবত এতদিন পরে মন্তব্য করা আমার পক্ষে নির্বোধ, তবে এটি এক বছর ধরে আমাকে বিরক্ত করছে ... আপনি যখন নতুন পথ শুরু করবেন তখন কল করুনbeginPath , কেবল কারণ আপনি তা ধরে নিবেন না ক্যানভাস সাফ করছে আপনি নিজের বিদ্যমান পথটি সাফ করতে চান! এটি একটি ভয়ঙ্কর অনুশীলন হবে এবং অঙ্কনের দিকে তাকানোর পিছনের দিক।
Prestaul

আপনি যদি কেবল সমস্ত কিছুর ক্যানভাস সাফ করতে চান তবে কি হবে। বলুন যে আপনি একটি গেম তৈরি করছেন এবং এটি আপনাকে এক সেকেন্ডের অনেক শততম সময়ে স্ক্রিনটি আবারও আঁকতে হবে।

1
@ জোসকুইনোনস, beginPathআপনার ক্যানভাসের কোনও কিছুই সাফ করে না, এটি পথটি পুনরায় সেট করে যাতে আপনার আঁকার আগে পূর্ববর্তী পাথের প্রবেশগুলি সরিয়ে ফেলা হয়। আপনার সম্ভবত এটির দরকার ছিল, তবে একটি অঙ্কন অপারেশন হিসাবে, কোনও ক্লিয়ারিং অপারেশন নয়। পরিষ্কার, তারপরে বিগপথ এবং অঙ্কন, পরিষ্কার নয় এবং সূচনাপথ, তারপরে অঙ্কন করুন। পার্থক্যটি কি বোঝায়? উদাহরণের জন্য এখানে দেখুন: w3schools.com/tags/canvas_beginpath.asp
প্রেস্টল

1
এটি সময়ের সাথে সাথে আমার অ্যানিমেশনটির মন্দার সমাধান করেছে। আমি প্রতিটি পদক্ষেপে গ্রিড লাইনগুলি পুনরায় আঁকলাম, তবে আগের পদক্ষেপটি থেকে লাইনগুলি সাফ না করেই।
জর্জি প্যাটশাইডার

118

অন্যরা ইতিমধ্যে প্রশ্নের উত্তর দেওয়ার জন্য একটি দুর্দান্ত কাজ clear()করেছেন তবে কনটেক্সট অবজেক্টের একটি সহজ পদ্ধতি যদি আপনার পক্ষে উপকারী হয় (এটি আমার কাছে ছিল), তবে উত্তরগুলির উপর ভিত্তি করে আমি এটি প্রয়োগ করি:

CanvasRenderingContext2D.prototype.clear = 
  CanvasRenderingContext2D.prototype.clear || function (preserveTransform) {
    if (preserveTransform) {
      this.save();
      this.setTransform(1, 0, 0, 1, 0, 0);
    }

    this.clearRect(0, 0, this.canvas.width, this.canvas.height);

    if (preserveTransform) {
      this.restore();
    }           
};

ব্যবহার:

window.onload = function () {
  var canvas = document.getElementById('canvasId');
  var context = canvas.getContext('2d');

  // do some drawing
  context.clear();

  // do some more drawing
  context.setTransform(-1, 0, 0, 1, 200, 200);
  // do some drawing with the new transform
  context.clear(true);
  // draw more, still using the preserved transform
};

6
এটি একটি দুর্দান্ত বাস্তবায়ন। আমি দেশীয় প্রোটোটাইপগুলি বাড়ানোর পক্ষে সম্পূর্ণ সমর্থন করি, তবে আপনি এটি নির্ধারণের আগে "ক্লিয়ার" সংজ্ঞায়িত না হওয়ার বিষয়টি নিশ্চিত করতে চাইতে পারেন - আমি এখনও কোনও দিন দেশীয় বাস্তবায়নের আশা করছি। :) আপনি কি জানেন কীভাবে ব্রাউজারগুলি ক্যানভাস রেন্ডারিং কনটেক্সট 2 ডি সমর্থন করে এবং "লিখনযোগ্য" রেখে যায়?
প্রেস্টাউল

প্রতিক্রিয়াটির জন্য ধন্যবাদ @ প্রেসটল - এছাড়াও, কোনও ব্রাউজার আপনাকে জাভাস্ক্রিপ্ট অবজেক্টগুলি এই পদ্ধতিতে প্রসারিত থেকে বিরত রাখতে পারে না।
জোনাথ্যাঙ্ক

@ জোনাথঙ্ক, আমি রূপান্তরটি পুনরায় সেট না করে সাফ করার মধ্যে পারফরম্যান্সের পার্থক্য সম্পর্কে কিছু প্রোফাইল দেখতে দেখতে চাই। আমি অনুমান করছি যে আপনি যদি খুব অল্প অঙ্কন করছেন তবে পার্থক্যটি প্রকট হয়ে উঠবে তবে আপনি যা আঁকেন তা যদি ক্ষুদ্র না হয় তবে পরিষ্কার পদক্ষেপটি নগণ্য ... আমার আরও সময় থাকতে পারে আমাকে পরে পরীক্ষা করতে হতে পারে :)
প্রীতিল

ঠিক আছে, আমি প্রোফাইলিং করেছি এবং আমি আমার পোস্টে বিশদ যুক্ত করব।
প্রীতিল

35
  • ক্রোম এতে ভাল প্রতিক্রিয়া জানিয়েছে: context.clearRect ( x , y , w , h );@ পেন্টিয়াম 10 এর পরামর্শ অনুসারে কিন্তু আইই 9 মনে হয় এই নির্দেশকে সম্পূর্ণ উপেক্ষা করবে।
  • canvas.width = canvas.width;আই 99 এর প্রতিক্রিয়া বলে মনে হচ্ছে: তবে আপনি যদি জন জোস অলস্প্পের প্রথম প্রস্থ পরিবর্তন করার সমাধানটি ব্যবহার না করেন তবে লাইনগুলি, কেবল আকারগুলি, ছবি এবং অন্যান্য অবজেক্টগুলি পরিষ্কার করে না।

সুতরাং আপনার যদি এমন একটি ক্যানভাস এবং প্রসঙ্গ তৈরি করা থাকে:

var canvas = document.getElementById('my-canvas');
var context = canvas.getContext('2d');

আপনি এই জাতীয় পদ্ধতি ব্যবহার করতে পারেন:

function clearCanvas(context, canvas) {
  context.clearRect(0, 0, canvas.width, canvas.height);
  var w = canvas.width;
  canvas.width = 1;
  canvas.width = w;
}

13
মনে রাখবেন যে পদ্ধতিটি কেবল প্রসঙ্গে এবং ব্যবহার করে সরল করা যেতে পারে context.clearRect(0,0,context.canvas.width,context.canvas.height)
ফ্রোগজ

5
আই ই 9 উচিত একেবারে একটি clearRect সাড়া ... (দেখুন: msdn.microsoft.com/en-us/library/ff975407(v=vs.85).aspx ) ধীর হিসাবে হিসাবে পরিবর্তন canvas.width হয়, একমাত্র উপায় আপনি ধীর হয়ে উঠতে পারেন এটি দুবার পরিবর্তন করে এবং ক্লিয়ারটকেটে কল করে।
Prestaul

1
দুঃখিত, আমার আরও স্পষ্ট হওয়া উচিত ... এই পদ্ধতিটি কার্যকর হবে (যতক্ষণ আপনি কোনও রূপান্তর প্রয়োগ করেননি) তবে এটি একটি [ধীর] নিষ্ঠুর শক্তি কৌশল যেখানে এটি প্রয়োজনীয় নয়। কেবল স্পষ্টরেক্টটি ব্যবহার করুন কারণ এটি দ্রুততম এবং ক্যানভাস বাস্তবায়নের সাথে প্রতিটি ব্রাউজার জুড়ে কাজ করা উচিত।
Prestaul

1
আমি বিশ্বাস করি যে আইই লাইনগুলি পুনরায় আঁকছে কারণ তারা এখনও পথের বাফারে রয়েছে। আমি এই ফর্ম্যাটটি ব্যবহার করি এবং এটি নিখুঁত কাজ করে। function clearCanvas(ctx) { ctx.beginPath(); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); }
ড্যারেনএমবি

আমি এর আগে প্রতিটি পদ্ধতি চেষ্টা করেছিলাম ... এবং এটিই কেবল কাজ করেছিল। আমি লাইন, আয়তক্ষেত্র এবং পাঠ্য সহ ক্রোম ব্যবহার করছি ... এমন কিছু করা যে এতটা কঠিন হতে পারে তা ভাবিনি! ধন্যবাদ!
অ্যান্টনি গ্রিগস

26

এটি 2018 এবং এখনও পুনরায় চিত্রের জন্য ক্যানভাস সম্পূর্ণরূপে সাফ করার কোনও দেশীয় পদ্ধতি নেই। সম্পূর্ণ ক্যানভাস পরিষ্কার clearRect() করে না । ভরাট নয় এমন ধরণের অঙ্কনগুলি সাফ হয়ে যায় না (উদাঃ rect())

1. আপনি কীভাবে আঁকেন তা নির্বিশেষে সম্পূর্ণ ক্যানভাসকে পরিষ্কার করতে:

context.clearRect(0, 0, context.canvas.width, context.canvas.height);
context.beginPath();

পেশাদাররা: স্ট্রোক স্টাইল, ফিলস স্টাইল ইত্যাদি সংরক্ষণ করে; পিছিয়ে নেই;

কনস: অকারণে যদি আপনি কিছু আঁকার আগে ইতিমধ্যে স্টার্টপথ ব্যবহার করেন

2. প্রস্থ / উচ্চতা হ্যাক ব্যবহার:

context.canvas.width = context.canvas.width;

অথবা

context.canvas.height = context.canvas.height;

পেশাদাররা: আইই কনসের সাথে কাজ করে: স্ট্রোক স্টাইল, ফিল স্টাইলকে কালোতে পুনরায় সেট করে; Laggy;

আমি ভাবছিলাম কেন স্থানীয় সমাধানের অস্তিত্ব নেই। আসলে, clearRect()একক লাইন সমাধান হিসাবে বিবেচিত হয় কারণ বেশিরভাগ ব্যবহারকারী beginPath()কোনও নতুন পথ আঁকার আগে করেন। যদিও সূচনাপথটি কেবল রেখাগুলি আঁকানোর সময় ব্যবহার করা হয় এবং বন্ধ পথের মতো নয়rect().

এই কারণেই গ্রহণযোগ্য উত্তরটি আমার সমস্যার সমাধান করেনি এবং আমি বিভিন্ন হ্যাকের চেষ্টা করে ঘন্টা নষ্ট করে দিয়েছি। অভিশাপ তুমি মজিলার


আমি মনে করি এটি সঠিক উত্তর, বিশেষত ক্যানভাস আঁকার জন্য। আমি বাকি প্রসঙ্গে ভুগছি ro স্ট্রোক করুন না কেন আমি ক্লিয়ারটকেট বলি, যদিও স্টার্টপ্যাথ সহায়তা করেছিল!
শাও-কুই

20

এক্স, ওয়াই কো-অর্ডিনেটস এবং ক্যানভাসের উচ্চতা এবং প্রস্থকে পেরিয়ে ক্লিয়াররেট পদ্ধতিটি ব্যবহার করুন। ক্লিয়ারআরেক্ট পুরো ক্যানভাসকে এইভাবে সাফ করবে:

canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);

আপনি এটিকে কেবল কোনও পদ্ধতিতে রাখতে পারেন এবং প্রতিবার কল করতে পারেন যে আপনি পর্দা রিফ্রেশ করতে চান, সঠিক।

@ XXX.xxx plz আপনার এইচটিএমএলে ক্যানভাসের আইডি চেক করুন এবং প্রথম লাইনের জন্য এটি ব্যবহার করুন (আইডির মাধ্যমে উপাদান পেতে)
বিশ্বাস

14

এখানে ভাল উত্তর একটি টন আছে। আরও একটি দ্রষ্টব্য হ'ল কখনও কখনও কেবল আংশিকভাবে ক্যানভাস পরিষ্কার করা মজাদার। এটি হ'ল, সম্পূর্ণ চিত্রটি মুছে ফেলার পরিবর্তে পূর্ববর্তী চিত্রটি "বিবর্ণ" করুন। এটি সুন্দর ট্রেইলের প্রভাব দিতে পারে।

এটি সহজ. মনে করুন আপনার পটভূমির রঙ সাদা:

// assuming background color = white and "eraseAlpha" is a value from 0 to 1.
myContext.fillStyle = "rgba(255, 255, 255, " + eraseAlpha + ")";
myContext.fillRect(0, 0, w, h);

আমি জানি এটি সম্ভব এবং আপনার উত্তর নিয়ে আমার কোনও সমস্যা নেই, আমি কেবল আশ্চর্য হই, যদি আপনার 2 টি অবজেক্ট থাকে যা চলমান থাকে এবং আপনি কেবল তার মধ্যে একটির ট্রেইল করতে চান তবে আপনি কীভাবে তা চালিয়ে যাবেন?
সুপার

এটি একটি ভাল চুক্তি আরও জটিল। সেক্ষেত্রে আপনার একটি অফ-স্ক্রিন ক্যানভাস তৈরি করা উচিত এবং প্রতিটি ফ্রেম এখানে বর্ণিত আংশিক-মুছন পদ্ধতিটি ব্যবহার করে সেই ক্যানভাসে আপনি যে জিনিসগুলি অনুসরণ করতে চান তা আঁকুন এবং প্রতিটি ফ্রেম মূল ক্যানভাসকে 100% সাফ করে, অ-ট্রেডযুক্ত আঁকুন অবজেক্টস, এবং তারপরে ড্রইমেজ () ব্যবহার করে অফ স্ক্রিন ক্যানভাসটি মূল একের উপরে মিশ্রিত করুন। আপনাকে চিত্রগুলির জন্য উপযুক্ত কিছুতে গ্লোবাল কম্পোজিট অপারেশনও সেট করতে হবে। উদাহরণস্বরূপ "বহুগুণ" হালকা পটভূমিতে অন্ধকার বস্তুর জন্য ভাল কাজ করবে।
ওরিওন এলিজিল

12

একটি দ্রুত উপায় করতে হয়

canvas.width = canvas.width

আইডিক কীভাবে এটি কাজ করে!


কি দারুন. এটি সত্যিই কাজ করে, আপনি কীভাবে এটি খুঁজে পেলেন?
জিপজিট

@ জিপিট কুইক ট্রিক আমি মিডিয়াম ডট কম থেকে খুঁজে পেয়েছি সাধারণ সাফ করার পরে রেন্ডারিং করা হয়নি :)
জ্যাকব মরিস

1
আমি আমার চুলগুলি টেনে আনছি কেন এটি কাজ করে তা বোঝার চেষ্টা করে! ভাগ করে নেওয়ার জন্য ধন্যবাদ!
অ্যাববিসিএসমিথ

যে কেউ কাজটি করতে পারে এবং এমনকি ক্যানভাস.উইউথ + = 0 কাজটিও ব্যাখ্যা করতে পারে, এর পিছনে ফ্রিকিং বিজ্ঞান কী?
পিওয়াইকে

8

এটি আমি ব্যবহার করি, নির্বিশেষে সীমানা এবং ম্যাট্রিক্স রূপান্তর:

function clearCanvas(canvas) {
  const ctx = canvas.getContext('2d');
  ctx.save();
  ctx.globalCompositeOperation = 'copy';
  ctx.strokeStyle = 'transparent';
  ctx.beginPath();
  ctx.lineTo(0, 0);
  ctx.stroke();
  ctx.restore();
}

মূলত, এটা প্রসঙ্গ বর্তমান অবস্থা সংরক্ষণ, এবং একটি স্বচ্ছ পিক্সেল স্বপক্ষে copyহিসাবে globalCompositeOperation। তারপরে, পূর্ববর্তী প্রসঙ্গের অবস্থাটি পুনরুদ্ধার করে।


এটা আমার জন্য কাজ করে...! ধন্যবাদ।
নোমান জাভেদ

6

এটি আমার পাইচার্টের জন্য চার্ট.জেজে কাজ করেছে

<div class="pie_nut" id="pieChartContainer">
    <canvas id="pieChart" height="5" width="6"></canvas> 
</div>

$('#pieChartContainer').html(''); //remove canvas from container
$('#pieChartContainer').html('<canvas id="pieChart" height="5" width="6"></canvas>'); //add it back to the container

5

আমি দেখতে পেয়েছি যে সমস্ত ব্রাউজারগুলিতে আমি পরীক্ষা করে দেখি যে, দ্রুততম উপায় হ'ল আসলে সাদা বা আপনি যে কোনও রঙের সাথে রঙিন করুন fill আমার একটি খুব বড় মনিটর রয়েছে এবং পূর্ণ স্ক্রিন মোডে স্পষ্টরেক্টটি agonizingly ধীর, তবে ফিলরেট যুক্তিসঙ্গত।

context.fillStyle = "#ffffff";
context.fillRect(0,0,canvas.width, canvas.height);

অসুবিধাটি হ'ল ক্যানভাসটি আর স্বচ্ছ নয়।


4

ওয়েবকিটে আপনাকে প্রস্থকে অন্য একটি মানকে নির্ধারণ করতে হবে, তারপরে আপনি এটিকে প্রাথমিক মানটিতে আবার সেট করতে পারেন



4

একটি সহজ, তবে খুব পঠনযোগ্য উপায় নয় এটি হ'ল:

var canvas = document.getElementId('canvas');

// after doing some rendering

canvas.width = canvas.width;  // clear the whole canvas


1
context.clearRect(0,0,w,h)   

আরজিবিএ মানগুলির সাথে প্রদত্ত আয়তক্ষেত্রটি পূরণ করুন:
0 0 0 0: ক্রোম দিয়ে
0 0 0 255: এফএফ এবং সাফারি সহ

কিন্তু

context.clearRect(0,0,w,h);    
context.fillStyle = 'rgba(0,0,0,1)';  
context.fillRect(0,0,w,h);  

আয়তক্ষেত্রটি
0 0 0 255 দিয়ে ভরে উঠুক
ব্রাউজারের কোনও ব্যাপার নেই!




0

দ্রুততম উপায়:

canvas = document.getElementById("canvas");
c = canvas.getContext("2d");

//... some drawing here

i = c.createImageData(canvas.width, canvas.height);
c.putImageData(i, 0, 0); // clear context by putting empty image data

12
বাহ ... কোন ব্রাউজারে? আমার (ক্রোম 22 এবং ওএস এক্সে ফায়ারফক্স 14) আপনার পদ্ধতিটি এখন পর্যন্ত সবচেয়ে ধীর বিকল্প। jsperf.com/canvas-clear-speed/9
Prestaul

1
> ভবিষ্যতে 5 বছর, এটি এখনও খুব বড় পরিমাণের দ্বারা ধীরতম পদ্ধতি er 700x এর চেয়ে ধীর clearRect
mgthomas99

0

আপনি যদি কেবল অঙ্কন জমা দেওয়ার জন্য কোনও ফর্মটিতে ক্লিয়াররেট ব্যবহার করেন তবে ক্লিয়ারিংয়ের পরিবর্তে আপনি একটি জমা পাবেন বা সম্ভবত এটি প্রথমে সাফ হয়ে যায় এবং পরে একটি অকার্যকর অঙ্কন আপলোড করতে হবে, তাই আপনাকে একটি যুক্ত করতে হবে ফাংশনটির শুরুতে ডিফল্ট প্রতিরোধ করুন:

   function clearCanvas(canvas,ctx) {
        event.preventDefault();
        ctx.clearRect(0, 0, canvas.width, canvas.height);
    }


<input type="button" value="Clear Sketchpad" id="clearbutton" onclick="clearCanvas(canvas,ctx);">

আশা করি এটি কাউকে সাহায্য করবে।


0

আমি সবসময় এটি ব্যবহার করি

ctx.clearRect(0, 0, canvas.width, canvas.height)
window.requestAnimationFrame(functionToBeCalled)

বিঃদ্রঃ

ক্লিয়ারট রেকট এবং অনুরোধের সংমিশ্রণ অ্যানিমেশনফ্রেম যদি আপনি যা করছেন তা যদি আরও তরল অ্যানিমেশনের অনুমতি দেয়


-2

আপনি কীভাবে একটি স্ট্যান্ডার্ড ক্যানভাস সাফ করেন তার সমস্ত দুর্দান্ত উদাহরণ, তবে আপনি যদি পেপারজ ব্যবহার করেন, তবে এটি কাজ করবে:

জাভাস্ক্রিপ্টে একটি বৈশ্বিক পরিবর্তনশীল সংজ্ঞা দিন:

var clearCanvas = false;

আপনার পেপারস্ক্রিপ্ট সংজ্ঞায়িত থেকে:

function onFrame(event){
    if(clearCanvas && project.activeLayer.hasChildren()){
        project.activeLayer.removeChildren();
        clearCanvas = false;
    }
}

এখন আপনি যেখানেই স্পষ্ট ক্যানভাস সেট করেছেন, এটি স্ক্রীন থেকে সমস্ত আইটেম সাফ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.