Нет, к сожалению. PNG-кодирование - относительный медленный процесс сам по себе (вы можете видеть это с большими изображениями, сохраненными в таких приложениях, как Photoshop).
Единственный эффективный способ ускорить работу - уменьшить размер растрового изображения canvas, который вы хотите кодировать - браузер не является оптимальным инструментом для обработки больших данных, таких как большие файлы изображений (размерные размеры), и они никогда не хотел делать подобные вещи.
Разбивка нарезанных фрагментов может помочь вам разблокировать пользовательский интерфейс. Но поскольку вы не можете кодировать их параллельно, и есть накладные расходы на создание кодированных данных Base-64, вам нужно будет использовать async setTimeout, чтобы дать браузеру некоторое время проанализировать очередь событий между каждым срезом и, конечно же, вам нужно было бы скомпоновать их в какой-то момент, где-то, так что это сделало бы его медленнее, более подверженным ошибкам и более сложным все-в-одном (сложный не нужен плохо, хотя в таких случаях). Вероятно, это ваш лучший выбор, хотя если уменьшить размер растрового изображения, это не вариант. И, как указывает Макс, существуют ограничения по размеру для данных-урис.
Вы можете сбросить необработанный буфер, используя getImageData()
, но затем вы получите буфер необработанного размера, который имеет цепочку других последствий.
Общие веб-работники могут теоретически делать кодирование параллельно, но, скорее всего, будут намного медленнее, чем позволить браузеру делать это в скомпилированном коде. Вам также нужно будет предоставить код для кодирования ... И, как и во многих новых вещах, у него пока нет полной или полной поддержки.
Попробуйте использовать метод HTMLCanvasElement.prototype.toBlob, но он работает только для FF и IE10 + (msToBlob). Также вы можете нарисовать часть изображения в холсте, прочитать эту часть с помощью toDataURL/toBlob и нарисовать новую, прочитать ее и сделать ее в цикле :) – Pinal
На ум приходят несколько возможностей: (1) Вы могли бы использовать советы Пинала и разбить ваше изображение на несколько более мелких холстов и сохранить те небольшие холсты к изображениям. (2) Вы также можете сериализовать только изменения, а не пытаться сохранить изображение и редактировать. (3) Возможно, ваш проект лучше всего сделать как приложение для настольных компьютеров и ноутбуков вместо приложения для браузера (4) Предложите свое приложение только в Chrome или Firefox, где пользователи теперь могут щелкнуть правой кнопкой мыши - сохранить холст в качестве изображения и отправить пользователю это изображение для вас в качестве загрузки файла на ваш сервер. – markE
Спасибо, что вы используете «HTMLCanvasElement.prototype.toBlob», чтобы получить что-то быстрее, без проблем я добавил compatablility для него – user3458948