Мой сценарий заключается в том, что ширина/высота холста динамически изменяются, и я не хочу сбрасывать холст. Вместо этого я использую clearRect(), так как знаю границы, в которых прямоугольник должен быть очищен.
Есть ли способ отключить сброс холста, когда ширина/высота снова установлены?
Есть ли способ сохранить предыдущее состояние и просто загрузить его обратно на холст, не перерисовывая его?
1 ответ
Боюсь, отключить это невозможно, это встроено в спецификацию холста.
Раздел 4.8.11:
При создании элемента холста и впоследствии всякий раз, когда устанавливаются атрибуты ширины и высоты (будь то новое значение или предыдущее значение), растровое изображение и любые связанные контексты должны быть очищены до исходного состояния и повторно инициализированы с помощью вновь указанные размеры координатного пространства.
Да, и GetImageData/PutImageData — это один из способов, но он, вероятно, намного медленнее, чем следующий:
Допустим, ваш холст называется
realCanvas
. Создайте второй холст (мы назовем егоfakeCanvas
), такого же размера, как и ваш настоящий холст, но сделайте его только в коде javascript и никогда не добавляйте его в документ (чтобы никто никогда не видеть это).Затем, прямо перед изменением размера
realCanvas
, выполните следующую операцию:fakeCanvasContext.drawImage(realCanvas, 0, 0);
Это перетянет один весь холст на другой, и это произойдет очень быстро с точки зрения производительности.
Как только вы закончите с изменением размера, вы можете отрисовать содержимое fakeCanvas обратно на свой реальныйCanvas.
realCanvasContext.drawImage(fakeCanvas, 0, 0);
Вот и все!
Если вы хотите получить техническую информацию, вы можете еще больше ускорить мой путь, выполнив это для второго розыгрыша:
realCanvasContext.drawImage(fakeCanvas, 0, 0, realCanvas.width, realCanvas.height, 0, 0, realCanvas.width, realCanvas.height);`
Таким образом, вы копируете только ту часть, которая может поместиться на
realCanvas
. Обратите внимание, что я не проверял написанный мной код, поэтому в нем могут быть синтаксические ошибки или две.
Похожие вопросы
Новые вопросы
html
HTML (язык гипертекстовой разметки) — это язык разметки для создания веб-страниц и другой информации, отображаемой в веб-браузере. Вопросы относительно HTML должны включать минимальный воспроизводимый пример и некоторое представление о том, чего вы пытаетесь достичь. Этот тег редко используется отдельно и часто в паре с [CSS] и [JavaScript].