После экспериментов с составными операциями и рисования изображений на холсте, я сейчас пытаюсь удалить изображения и композитинг. Как мне это сделать?
Мне нужно очистить холст для перерисовки других изображений; это может продолжаться некоторое время, поэтому я не думаю, что рисование нового прямоугольника каждый раз будет наиболее эффективным вариантом.
clearRect
вам нужно либо иметь нетрансформированный контекст, либо отслеживать ваши фактические границы.context.clearRect(0, 0, context.canvas.width, context.canvas.height)
. Это фактически то же самое, но на одну зависимость меньше (1 переменная вместо 2)Использование:
context.clearRect(0, 0, canvas.width, canvas.height);
Это самый быстрый и описательный способ очистить весь холст.
Не используйте:
canvas.width = canvas.width;
Сброс
canvas.width
сбрасывает все состояние холста (например, transformation, lineWidth, strokeStyle и т. Д.), Он очень медленный (по сравнению с clearRect), он работает не во всех браузерах и не описывает, что вы на самом деле пытаетесь сделать.Работа с преобразованными координатами
Если вы изменили матрицу преобразования (например, используя
scale
,rotate
илиtranslate
), тоcontext.clearRect(0,0,canvas.width,canvas.height)
, скорее всего, не очистите всю видимую часть холста.Решение? Сброс матрицы преобразования до очистки холста:
Редактировать: я только что провел некоторое профилирование и (в Chrome) примерно на 10% быстрее очистить холст 300x150 (размер по умолчанию) без сброса преобразования. По мере увеличения размера вашего холста эта разница уменьшается.
Это уже относительно незначительно, но в большинстве случаев вы будете рисовать значительно больше, чем очищаете, и я считаю, что эта разница в производительности не имеет значения.
источник
canvas
переменной, используяctx.canvas
вместо этого.canvas.width
иcanvas.height
при очистке. Я не проводил никакого числового анализа разницы во времени выполнения по сравнению со сбросом преобразования, но я подозреваю, что это принесет чуть лучшую производительность.Если вы рисуете линии, убедитесь, что вы не забыли:
В противном случае линии не будут очищены.
источник
beginPath
когда начнете новый путь , не думайте, что только потому, что вы очищаем холст, который вы хотите очистить существующий путь! Это было бы ужасной практикой и обратным взглядом на рисование.beginPath
ничего не удаляет с вашего холста, он сбрасывает путь, так что предыдущие записи пути удаляются перед рисованием. Возможно, вам это нужно, но это не операция очистки, а операция рисования. очистить, затем beginPath и рисовать, не очистить и beginPath, затем нарисовать. Имеет ли смысл разница? Посмотрите здесь для примера: w3schools.com/tags/canvas_beginpath.aspДругие уже проделали отличную работу, отвечая на вопрос, но если простой
clear()
метод на объекте контекста был бы полезен для вас (это было для меня), я использую эту реализацию, основываясь на ответах здесь:Применение:
источник
context.clearRect ( x , y , w , h );
как предлагает @ Pentium10, но IE9, похоже, полностью игнорирует эту инструкцию.canvas.width = canvas.width;
но он не очищает линии, только фигуры, рисунки и другие объекты, если только вы не используете решение @John Allsopp о первом изменении ширины.Так что если у вас есть холст и контекст, созданный так:
Вы можете использовать такой метод:
источник
context.clearRect(0,0,context.canvas.width,context.canvas.height)
.function clearCanvas(ctx) { ctx.beginPath(); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); }
Это 2018 год, и до сих пор нет собственного способа полностью очистить холст для перерисовки.
clearRect()
не очищает холст полностью Чертежи типа Non-штриховки не убрались (например.rect()
)1. Чтобы полностью очистить холст, независимо от того, как вы рисуете:
Плюсы: сохраняет инсульты, fillStyle и т.д .; Нет лагов;
Минусы: не нужны, если вы уже используете beginPath перед рисованием чего-либо
2. Используя хак ширины / высоты:
ИЛИ
Плюсы: Работает с IE. Минусы: Сбрасывает strokeStyle, fillStyle в черный; лаг;
Мне было интересно, почему родного решения не существует. На самом деле,
clearRect()
рассматривается как однолинейное решение, потому что большинство пользователей делают,beginPath()
прежде чем рисовать любой новый путь. Хотя beginPath должен использоваться только при рисовании линий, а не при закрытом пути, какrect().
Это причина, по которой принятый ответ не решил мою проблему, и я потратил часы, пытаясь использовать различные способы взлома. Проклинаю тебя мозилла
источник
Используйте метод clearRect, передавая координаты x, y, а также высоту и ширину холста. ClearRect очистит весь холст как:
источник
Здесь есть множество хороших ответов. Еще одно замечание: иногда бывает весело только частично очистить холст. то есть «затухает» предыдущее изображение, а не стирает его полностью. это может дать хорошие следы эффектов.
это просто. Предположим, ваш цвет фона белый:
источник
Быстрый способ сделать
ИДК, как это работает, но это делает!
источник
Это то, что я использую, независимо от границ и матричных преобразований:
По сути, он сохраняет текущее состояние контекста и рисует прозрачный пиксель с
copy
asglobalCompositeOperation
. Затем восстанавливает предыдущее состояние контекста.источник
Это сработало для моего pieChart в chart.js
источник
Я обнаружил, что во всех браузерах, которые я тестирую, самый быстрый способ - заполнить Rect белым или любым другим цветом, который вы хотите. У меня очень большой монитор, и в полноэкранном режиме clearRect мучительно медленный, но fillRect оправдан.
Недостатком является то, что холст больше не является прозрачным.
источник
в webkit вам нужно установить ширину на другое значение, затем вы можете вернуть его к первоначальному значению
источник
источник
Простой, но не очень читаемый способ - написать так:
источник
Я всегда использую
источник
заполните данный прямоугольник значениями RGBA:
0 0 0 0: с Chrome
0 0 0 255: с FF & Safari
Но
пусть прямоугольник заполнен
0 0 0 255
независимо от браузера!
источник
Пример:
context.clearRect(0, 0, canvas.width, canvas.height);
источник
кратчайший путь:
источник
самый быстрый способ:
источник
clearRect
.Если вы используете только clearRect, если у вас есть его в форме для отправки чертежа, вы получите отправку вместо очистки, или, возможно, сначала ее можно очистить, а затем загрузить недействительный чертеж, поэтому вам нужно будет добавить protectDefault в начале функции:
Надеюсь, это кому-нибудь поможет.
источник
Я всегда этим пользуюсь
НОТА
объединение clearRect и requestAnimationFrame позволяет более плавную анимацию, если это то, что вы собираетесь
источник
Все это отличные примеры того, как вы очищаете стандартный холст, но если вы используете paperjs, то это будет работать:
Определите глобальную переменную в JavaScript:
Из вашего PaperScript определите:
Теперь, где бы вы ни установили clearCanvas в true, он удалит все элементы с экрана.
источник