නැවත ඇඳීම සඳහා කැන්වස් ඉවත් කරන්නේ කෙසේද?


1035

සංයුක්ත මෙහෙයුම් අත්හදා බැලීමෙන් පසු සහ කැන්වසය මත රූප ඇඳීමෙන් පසු මම දැන් උත්සාහ කරන්නේ රූප ඉවත් කිරීමට සහ සංයුක්ත කිරීමට ය. මම මෙය කරන්නේ කෙසේද?

වෙනත් පින්තූර නැවත ඇඳීම සඳහා මට කැන්වසය ඉවත් කිරීමට අවශ්‍යයි; මෙය ටික වේලාවක් පැවතිය හැකි බැවින් සෑම විටම නව සෘජුකෝණාස්රයක් ඇඳීම වඩාත් කාර්යක්ෂම විකල්පයක් වනු ඇතැයි මම නොසිතමි.

Answers:


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

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

44
clearRectඔබට පරිවර්තනය නොකළ සන්දර්භයක් තිබිය යුතු බව හෝ ඔබේ සත්‍ය සීමාවන් නිරීක්ෂණය කළ යුතු බව සලකන්න .
ෆ්‍රොග්ස්

7
කැන්වස් පළල සැකසීම අ) එය වෙනත් අගයකට සැකසිය යුතු අතර පසුව වෙබ්කිට් අනුකූලතාව සඳහා නැවත අවශ්‍ය වන අතර ආ) මෙය ඔබේ සන්දර්භය පරිවර්තනය නැවත සකසනු ඇත .
ෆ්‍රොග්ස්

45
පළල උපක්‍රමය භාවිතා නොකරන්න. එය අපිරිසිදු කඩුල්ලක්. ජාවාස්ක්‍රිප්ට් වැනි ඉහළ මට්ටමේ භාෂාවකින් ඔබට අවශ්‍ය වන්නේ ඔබේ අභිප්‍රායයන් වඩාත් හොඳින් ප්‍රකාශ කිරීමයි, ඉන්පසු පහළ මට්ටමේ කේතය ඒවා ඉටු කිරීමට ඉඩ දෙන්න. පළල තමාටම සකසා ගැනීමෙන් ඔබේ සැබෑ අභිප්‍රාය සඳහන් නොවේ , එනම් කැන්වසය ඉවත් කිරීමයි.
andrewrk

22
මුළුමනින්ම සුළු යෝජනාවක් නමුත් මම යෝජනා කරමි context.clearRect(0, 0, context.canvas.width, context.canvas.height). එය
effectively ලදායී

9
මෙම පිළිතුර වඩාත් මෑත කාලීන පා readers කයින් සඳහා: මෙම පිළිතුර වෙනස් කරන ලද බවත් ඉහත අදහස් සමහරක් තවදුරටත් අදාළ නොවන බවත් මතක තබා ගන්න .
daveslab

726

භාවිත: context.clearRect(0, 0, canvas.width, canvas.height);

සමස්ත කැන්වසය ඉවත් කිරීමට වේගවත්ම හා විස්තරාත්මක ක්‍රමය මෙයයි.

පාවිච්චි කරන්න එපා: canvas.width = canvas.width;

යළි පිහිටුවීම canvas.widthසියලු කැන්වස් තත්වය (උදා: පරිණාමන, රේඛීය පළල, ආ roke ාත ස්ටයිල්, ආදිය), එය ඉතා මන්දගාමී වේ (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% ක් පමණ වේගවත් වේ. ඔබේ කැන්වසයේ ප්‍රමාණය වැඩි වන විට මෙම වෙනස පහත වැටේ.

එය දැනටමත් සාපේක්ෂව නොවැදගත් ය, නමුත් බොහෝ අවස්ථාවන්හි දී ඔබ ඉවත් කිරීමට වඩා සැලකිය යුතු ප්‍රමාණයක් ඔබ අඳිනු ඇති අතර මෙම කාර්යසාධන වෙනස අදාල නොවන බව මම විශ්වාස කරමි.

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

4
UmYumYumYum: පැහැදිලි () සම්මත ශ්‍රිතයක්ද? එය එසේ නොවන බව පෙනේ.
බ්‍රෙන්ට් බ්‍රැඩ්බර්න්

7
ඒ වෙනුවට canvasභාවිතා කිරීමෙන් දේශීය විචල්‍යයක අවශ්‍යතාවය ඉවත් කළ හැකි බව සලකන්න ctx.canvas.
ඩ්‍රූ නොක්ස්

1
Rew ඩ්‍රූනෝක්ස්, හොඳ කරුණක්, නමුත් මම සෑම විටම පාහේ වේග අරමුණු සඳහා වෙනම විචල්‍යයන් තෝරා ගනිමි. එය අතිශයින්ම සුළු ය, නමුත් මම නිතර භාවිතා කරන ගුණාංග අන්වර්ථකරණය කිරීමෙන් (විශේෂයෙන් සජීවිකරණ පුඩුවක් ඇතුළත) කාලය අඩු කිරීම වළක්වා ගැනීමට උත්සාහ කරමි.
ප්‍රෙස්ටෝල්

බිඳුණු රූප සබැඳිය නිසා ඇලෙක්සැන්ඩර්ගේ නිරූපණය තවදුරටත් ක්‍රියාත්මක නොවීය, ස්ථාවර: jsfiddle.net/Ktqfs/50
ඩොමිනෝ

පරිවර්තනය න්යාසය වෙනස් කිරීමේ සිද්ධිය සම්බන්ධයෙන් සමස්ත කැන්වස් ඉවත් කිරීමට තවත් ක්රමයක් හුදෙක් පරිවර්තනයන් පිළිබඳ වාර්තාවක් තබා හා ඒවා ඔබ අයදුම් කිරීමට canvas.widthසහ canvas.heightඉවත් කිරීමේ විට. පරිණාමනය නැවත සැකසීමට සාපේක්ෂව මම ධාවන කාල වෙනස පිළිබඳව සංඛ්‍යාත්මක විශ්ලේෂණයක් කර නැත, නමුත් එය වඩා හොඳ කාර්ය සාධනයක් ලබා දෙනු ඇතැයි මම සැක කරමි.
නැනෝ විශාරද

229

ඔබ රේඛා අඳින්නේ නම්, ඔබට අමතක නොවන බවට වග බලා ගන්න:

context.beginPath();

එසේ නොමැතිනම් රේඛා හිස් නොවේ.


11
මම දන්නවා මෙය ටික කලක් මෙහි සිට ඇති අතර මෙතරම් කාලයක් ගතවීමෙන් පසුව අදහස් දැක්වීම මට මෝඩකමක් විය හැකි නමුත් මෙය වසරක් තිස්සේ මට කරදරයක් වී ඇත ... ඔබ නව මාර්ගයක් ආරම්භ කරන විට අමතන්න beginPath, ඔබ පමණක් යැයි නොසිතන්න ඔබේ පවතින මාර්ගයද ඉවත් කිරීමට අවශ්‍ය කැන්වසය ඉවත් කරයි! මෙය බිහිසුණු ක්‍රියාවක් වන අතර එය චිත්‍ර ඇඳීමේ පසුගාමී ක්‍රමයකි.
ප්‍රෙස්ටෝල්

සෑම දෙයකම කැන්වසය ඉවත් කිරීමට ඔබට අවශ්‍ය නම් කුමක් කළ යුතුද? ඔබ ක්‍රීඩාවක් නිර්මාණය කරන බවත් තත්පරයට සියගණනක් තිරය නැවත ඇඳීමට අවශ්‍ය බවත් කියමු.

1
Os ජෝස් ක්වීනෝන්ස්, beginPathඔබේ කැන්වසයෙන් කිසිවක් ඉවත් නොකරයි, එය මාර්ගය නැවත සකසයි, එවිට ඔබ ඇඳීමට පෙර පෙර මාර්ග ඇතුළත් කිරීම් ඉවත් කරනු ලැබේ. ඔබට එය බොහෝ විට අවශ්‍ය වන්නට ඇත, නමුත් ඇඳීමේ මෙහෙයුමක් ලෙස මිස නිෂ්කාශන මෙහෙයුමක් නොවේ. පැහැදිලි, පසුව ආරම්භක මාවත සහ අදින්න, පැහැදිලි සහ ආරම්භක මාවත නොවේ, පසුව අඳින්න. වෙනස තේරුමක් තිබේද? උදාහරණයක් සඳහා මෙහි බලන්න: w3schools.com/tags/canvas_beginpath.asp
Prestaul

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
මෙය විශිෂ්ට ක්‍රියාත්මක කිරීමකි. දේශීය මූලාකෘති වැඩි දියුණු කිරීමට මම සම්පුර්ණයෙන්ම සහාය දෙමි, නමුත් එය පැවරීමට පෙර "පැහැදිලි" යන්න නිර්වචනය කර නොමැති බව සහතික කිරීමට ඔබට අවශ්‍ය විය හැකිය - මම තවමත් යම් දිනෙක ස්වදේශීය ක්‍රියාත්මක කිරීමක් බලාපොරොත්තු වෙමි. :) CanvasRenderingContext2D සඳහා බ්‍රව්සර් කොතරම් පුළුල් ලෙස සහය දක්වනවාද සහ එය "ලිවිය හැකි" ලෙස තබන්නේ කෙසේදැයි ඔබ දන්නවාද?
ප්‍රෙස්ටෝල්

ප්‍රතිපෝෂණයට ස්තූතියි res ප්‍රෙස්ටෝල් - එසේම, මේ ආකාරයෙන් ජාවාස්ක්‍රිප්ට් වස්තු දිගු කිරීමෙන් කිසිදු බ්‍රව්සරයක් ඔබව වළක්වා නොගත යුතුය.
ජොනතන්කේ

On ජොනතන්කේ, පරිණාමනය නැවත සකස් නොකර සහ ඉවත් කිරීම අතර කාර්ය සාධන වෙනස පිළිබඳ යම් විස්තරයක් දැකීමට මා කැමතිය. මම අනුමාන කරන්නේ ඔබ කුඩා චිත්‍රයක් කරන්නේ නම් වෙනස පැහැදිලිව පෙනෙනු ඇති නමුත් ඔබ අඳින දේ සුළුපටු නොවේ නම් පැහැදිලි පියවර නොසැලකිලිමත් වන බවයි ... මට වැඩි කාලයක් ඇති විට එය පසුව පරීක්ෂා කිරීමට සිදුවනු ඇත :)
Prestaul

හරි, මම පැතිකඩ කළ අතර මම විස්තර මගේ පෝස්ටයට එක් කරන්නෙමි.
ප්‍රෙස්ටෝල්

35
  • ක්‍රෝම් ඊට හොඳ ප්‍රතිචාර දක්වයි: context.clearRect ( x , y , w , h );ent පෙන්ටියම් 10 යෝජනා කළ පරිදි IE9 මෙම උපදෙස් සම්පූර්ණයෙන්ම නොසලකා හරින බව පෙනේ.
  • IE9 ප්‍රතිචාර දක්වන්නේ: canvas.width = canvas.width; නමුත් පළල වෙනස් කිරීම සඳහා ජෝන් ඇල්සොප්ගේ විසඳුම ඔබ භාවිතා නොකරන්නේ නම් එය රේඛා, හැඩතල, පින්තූර සහ වෙනත් වස්තූන් ඉවත් නොකරයි.

එබැවින් ඔබට කැන්වසය සහ සන්දර්භය මේ ආකාරයෙන් නිර්මාණය කර ඇත්නම්:

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
IE 9 පැහැදිලි ඇමතුමකට නියත වශයෙන්ම ප්‍රතිචාර දැක්විය යුතුය ... (බලන්න: msdn.microsoft.com/en-us/library/ff975407(v=vs.85).aspx ) කැන්වස් වෙනස් කිරීම මන්දගාමී වේ. පළල එකම ක්‍රමය ඔබට මන්දගාමී විය හැක්කේ එය දෙවරක් වෙනස් කිරීමෙන් සහ clearRect ඇමතීමෙන් ය.
ප්‍රෙස්ටෝල්

1
කණගාටුයි, මම වඩාත් පැහැදිලි විය යුතුයි ... මෙම ක්‍රමය ක්‍රියාත්මක වනු ඇත (ඔබ පරිණාමනයක් යොදවා නොමැති තාක් කල්), නමුත් එය අවශ්‍ය නොවන [මන්දගාමී] තිරිසන් බල තාක්‍ෂණයකි. ClearRect භාවිතා කරන්න, එය වේගවත් වන අතර සෑම බ්‍රව්සරයක් පුරාම කැන්වස් ක්‍රියාත්මක කිරීමක් සමඟ ක්‍රියා කළ යුතුය.
ප්‍රෙස්ටෝල්

1
මම විශ්වාස කරන්නේ අයිඊ තවමත් රේඛා නැවත ඇඳීම නිසා ඒවා තවමත් මාර්ග බෆරයේ පවතින බවයි. මම මෙම ආකෘතිය භාවිතා කරන අතර එය පරිපූර්ණව ක්‍රියා කරයි. function clearCanvas(ctx) { ctx.beginPath(); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); }
ඩැරන්එම්බී

මම මීට පෙර සෑම ක්‍රමයක්ම අත්හදා බැලුවෙමි ... තවද මෙය ක්‍රියාත්මක වූයේ එකම ක්‍රමයයි. මම ක්‍රෝම් භාවිතා කරන්නේ රේඛා, සෘජුකෝණාස්රා සහ පෙළ සමඟිනි ... ගොඩනගා ගත යුතු දෙයක් කිරීම එතරම් අපහසු වනු ඇතැයි සිතුවේ නැත! ස්තූතියි!
ඇන්තනි ග්‍රිග්ස්

29

මෙය 2018 වන අතර නැවත ඇඳීම සඳහා කැන්වස් සම්පූර්ණයෙන්ම ඉවත් කිරීමට තවමත් දේශීය ක්‍රමයක් නොමැත. කැන්වසය සම්පූර්ණයෙන්ම ඉවත් clearRect() නොකරයි . පිරවුම් නොවන ආකාරයේ ඇඳීම් ඉවත් නොකෙරේ (උදා. rect())

1. ඔබ අඳින්නේ කෙසේද යන්න නොසලකා කැන්වස් සම්පූර්ණයෙන්ම ඉවත් කිරීමට:

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

වාසි: ආ roke ාත ස්ටයිල්, ෆිල්ස්ටයිල් ආදිය ආරක්ෂා කරයි; ප්‍රමාදයක් නැත;

අවාසි: කිසිවක් ඇඳීමට පෙර ඔබ දැනටමත් ආරම්භක මාර්ගය භාවිතා කරන්නේ නම් අනවශ්‍යය

2. පළල / උස හැක් කිරීම:

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

හෝ

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

වාසි: IE සමඟ ක්‍රියා කරයි. ලග්නය;

දේශීය විසඳුමක් නොපවතින්නේ මන්දැයි මම කල්පනා කළෙමි. ඇත්ත වශයෙන්ම, clearRect()තනි පේළි විසඳුමක් ලෙස සලකනු ලබන්නේ බොහෝ පරිශීලකයින් beginPath()ඕනෑම නව මාර්ගයක් ඇඳීමට පෙර කරන බැවිනි . ආරම්භක මාවත භාවිතා කළ යුත්තේ රේඛා ඇඳීමේදී පමණක් වන අතර එය සංවෘත මාර්ගයක් නොවේrect().

පිළිගත් පිළිතුර මගේ ගැටලුව විසඳීමට හේතුව මෙය වන අතර මම විවිධ උපක්‍රම උත්සාහ කරමින් පැය ගණනක් නාස්ති කළෙමි. ඔබට මොසිල්ලාට ශාප කරන්න


1
මම හිතන්නේ මෙය නිවැරදි පිළිතුරයි, විශේෂයෙන් කැන්වස් ඇඳීම සඳහා. මම ඉතිරිව ඇති සන්දර්භයෙන් පීඩා වින්දා. මම පැහැදිලි රෙක්ට් ලෙස හැඳින්වුවද, ආරම්භක මාවත උදව් විය!
ෂාවෝ-කුයි

20

X, y ඛණ්ඩාංක සහ කැන්වස් වල උස හා පළල පසු කිරීමෙන් පැහැදිලි රෙක්ට් ක්‍රමය භාවිතා කරන්න. ClearRect විසින් සම්පූර්ණ කැන්වස් පහත පරිදි ඉවත් කරනු ඇත:

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

ඔබට මෙය ක්‍රමයකට දමා තිරය නැවුම් කිරීමට අවශ්‍ය සෑම අවස්ථාවකම එය අමතන්න, නිවැරදි කරන්න.

H XXX.xxx plz ඔබේ HTML හි කැන්වස් හැඳුනුම්පත පරීක්ෂා කර පළමු පේළිය සඳහා එයම භාවිතා කරන්න (හැඳුනුම්පතෙන් මූලද්‍රව්‍යය ලබා ගැනීම සඳහා)
විශ්වස්

13

මෙහි හොඳ පිළිතුරු ටොන් ගණනක් තිබේ. තවත් සටහනක් නම් සමහර විට කැන්වසය අර්ධ වශයෙන් ඉවත් කිරීම විනෝදජනක බවයි. එනම්, පෙර රූපය මුළුමනින්ම මකා දැමීම වෙනුවට "මැකී යන්න". මෙය හොඳ මංපෙත් විපාක ලබා දිය හැකිය.

එය පහසුයි. ඔබගේ පසුබිම් වර්ණය සුදු යැයි සිතමු:

// 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% ක් ඉවත් කර, පසුපස නොයන්න වස්තූන්, පසුව ඩ්‍රයිඉමේජ් () භාවිතා කර ප්‍රධාන තිරයට අක්‍රිය තිරයේ කැන්වස් සංයුක්ත කරන්න. පින්තූර සඳහා සුදුසු දෙයකට ගෝලීය සංයුක්ත ක්‍රියාකාරිත්වය සැකසීමටද ඔබට අවශ්‍ය වනු ඇත. උදා: සැහැල්ලු පසුබිමක අඳුරු වස්තූන් සඳහා "ගුණ කිරීම" හොඳින් ක්‍රියා කරයි.
orion elenzil

12

ඉක්මන් ක්‍රමයක් වන්නේ එය කිරීමයි

canvas.width = canvas.width

Idk එය ක්‍රියා කරන ආකාරය නමුත් එය ක්‍රියාත්මක වේ!


වොව්. මෙය සැබවින්ම ක්‍රියාත්මක වේ, ඔබ මෙය කවදා හෝ සොයාගත්තේ කෙසේද?
zipzit

ipzipit ක්ෂණික උපක්‍රමය සාමාන්‍ය නිශ්කාෂණය කිරීමෙන් පසුව මාධ්ය වෙබ් අඩවියෙන් ඉවත් විය :)
ජේකොබ් මොරිස්

2
මම මගේ කොණ්ඩය අදින්නේ මෙය ක්‍රියාත්මක වන්නේ ඇයිදැයි වටහා ගැනීමටයි! බෙදාගැනීම ගැන ස්තූතියි!
aabbccsmith

එය ක්‍රියාත්මක වන්නේ මන්දැයි කිසිවෙකුට පැහැදිලි කළ හැකිද සහ canvas.width + = 0 ද කාර්යය ඉටු කරයි, මේ පිටුපස ඇති විකාර විද්‍යාව කුමක්ද?
PYK

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. ඉන්පසු, පෙර සන්දර්භය තත්වය යථා තත්වයට පත් කරයි.


7

මෙය char.js හි මගේ පයිචාර්ට් සඳහා වැඩ කළේය

<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

මා විසින් පරීක්ෂා කරන ලද සියලුම බ්‍රව්සර්වල වේගවත්ම ක්‍රමය වන්නේ සුදු පැහැයෙන් හෝ ඔබ කැමති ඕනෑම වර්ණයකින් පුරවා ගැනීමයි. මා සතුව ඉතා විශාල මොනිටරයක් ​​ඇති අතර සම්පූර්ණ තිර ප්‍රකාරයේදී clearRect ඉතා මන්දගාමී වේ, නමුත් fillRect සාධාරණයි.

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

අවාසිය නම් කැන්වසය තවදුරටත් විනිවිද නොවීමයි.


4

වෙබ්කිට් වලදී ඔබට පළල වෙනත් අගයකට සැකසිය යුතුය, එවිට ඔබට එය නැවත ආරම්භක අගයට සැකසිය හැකිය


4
function clear(context, color)
{
    var tmp = context.fillStyle;
    context.fillStyle = color;
    context.fillRect(0, 0, context.canvas.width, context.canvas.height);
    context.fillStyle = tmp;
}

මෙය clearRect (0,0, canvas.width, canvas.height) ට වඩා මන්දගාමී වේ
sEver

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)   

දී ඇති සෘජුකෝණාස්රය RGBA අගයන් සමඟ පුරවන්න:
0 0 0 0: Chrome සමඟ
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 පිරවූ සෘජුකෝණාස්රය ඉඩ දෙන්න
!


1
Context.clearRect(starting width, starting height, ending width, ending height);

උදාහරණයක්: context.clearRect(0, 0, canvas.width, canvas.height);



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
වාව් ... කුමන බ්‍රව්සරයේද? මගේ (OS X හි Chrome 22 සහ Firefox 14) ඔබේ ක්‍රමය බොහෝ දුරට මන්දගාමී විකල්පයයි. jsperf.com/canvas-clear-speed/9
ප්‍රෙස්ටෝල්

1
> අනාගතයේ වසර 5 ක්, මෙය තවමත් ඉතා විශාල මුදලකින් මන්දගාමී ක්‍රමය වන අතර x 700x වඩා මන්දගාමී වේ clearRect.
mgthomas99

0

ඔබ clearRect පමණක් භාවිතා කරන්නේ නම්, ඔබේ චිත්‍රය ඉදිරිපත් කිරීම සඳහා ඔබ සතුව පෝරමයක් තිබේ නම්, ඔබට නිශ්කාෂණය වෙනුවට ඉදිරිපත් කිරීමක් ලැබෙනු ඇත, නැතහොත් සමහර විට එය පළමුව නිෂ්කාශනය කර අවලංගු චිත්‍රයක් උඩුගත කළ හැකිය, එවිට ඔබට එකතු කළ යුතුය ශ්‍රිතය හිඟමනේ දී වැළැක්වීම:

   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)

සටහන

clearRect සහ requestAnimationFrame සංයෝජනය කිරීමෙන් ඔබ යන්නේ නම් වැඩි තරල සජීවීකරණයක් සඳහා ඉඩ ලබා දේ


-2

මේ සියල්ල ඔබ සම්මත කැන්වස් ඉවත් කරන ආකාරය පිළිබඳ විශිෂ්ට උදාහරණ වේ, නමුත් ඔබ කඩදාසි භාවිතා කරන්නේ නම් මෙය ක්‍රියාත්මක වනු ඇත:

ජාවාස්ක්‍රිප්ට් හි ගෝලීය විචල්‍යයක් නිර්වචනය කරන්න:

var clearCanvas = false;

ඔබේ කඩදාසි පිටපතෙන් අර්ථ දක්වන්න:

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

දැන් ඔබ පැහැදිලි කැන්වස් සත්‍ය ලෙස සකසන ඕනෑම තැනක, එය තිරයෙන් සියලුම අයිතම ඉවත් කරයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.