QR-код – это очень распространенная техника кодирования информации в виде изображений. Он очень часто используется в физических магазинах для идентификации товаров, подобно тому, как используется штрих-код. Эта библиотека позволяет сканировать QR-код в веб-приложениях с помощью веб-камеры или камеры на смартфонах. Это простая библиотека размером 52 Кб, написанная на чистом js.
В 2015 году я написал библиотеку для сканирования QR-кодов на основе HTML5 в качестве расширения jQuery. Недавно я заметил, что на моем проекте на Github и демонстрационной странице наблюдается постоянный трафик. Когда я углубился в суть происходящего, мне стало стыдно за плохой дизайн и устаревшую поддержку последних HTML API вокруг Camera. Недавно я исправил некоторые проблемы и подверг рефакторингу библиотеку javascript, которая теперь не зависит от jQuery и поддерживает API на основе Promise.
В этой статье я объясню, как использовать новую версию библиотеки, некоторые изменения и их причины, а также существующие проблемы и планы по их устранению. Если говорить громко, то основными изменениями являются:
- Удалена зависимость от jQuery
- Переработаны API, чтобы возвращать Promise, а не основываться исключительно на обратных вызовах.
Содержание
Вступление
QR-код – это очень распространенная техника кодирования информации в виде изображений. Он очень часто используется в физических магазинах для идентификации товаров, подобно тому, как используется штрих-код.
Данная javascript библиотека позволяет пользователям добавлять сканер QR-кодов в свои веб-приложения. Она работает кросс-платформенно и на различных устройствах, таких как PC, Mac или смартфоны. Он использует поток с камеры и пытается декодировать кадры с определенной частотой (настраиваемой) и уведомляет вызывающую сторону о результатах через обратные вызовы. Запрос разрешений на камеру в браузерах обычно приводит к появлению всплывающего диалогового окна с запросом разрешений и может быть использован только в том случае, если пользователь их предоставит.
Как использовать
Загрузите код Javascript или используйте версию на Github
Код размещен по адресу mebjas/html5-qrcode на Github. Вы можете скачать библиотеку и добавить ее в свою кодовую базу со страницы релиза или использовать ее напрямую:
<script src="https://raw.githubusercontent.com/mebjas/html5-qrcode/master/minified/html5-qrcode.min.js"></script>Я настоятельно рекомендую использовать минифицированную версию по следующим причинам:
- Она меньше по размеру и загружается быстрее.
- Фактический код html5-qrcode.js написан с использованием ECMAScript, который поддерживается только в последних версиях браузеров. Он может не поддерживаться в более старых браузерах. Минифицированный скрипт был транспонирован с помощью Babel.
Если вы все еще хотите использовать неминифицированную библиотеку (не рекомендуется), попробуйте включить в нее вот это:
<script src="./jsqrcode-combined.js"></script><script src="./html5-qrcode.js"></script>Добавьте элемент palceholder в HTML
Добавьте пустой HTML-элемент в соответствующую позицию в вашем HTML-коде, задайте ему id. Библиотека использует этот элемент для вставки некоторых скрытых HTML-элементов, которые отображаются в виде видоискателя (вход камеры отображается в этом HTML-элементе) для пользователя, выполняющего сканирование QR-кода.
Перечислите все доступные камеры
Html5Qrcode предоставляет статический метод для перечисления всех поддерживаемых камер в устройстве. Вызов этого метода вызовет разрешения пользователя, так как эти разрешения необходимы для получения названия камер в некоторых браузерах. Этот метод возвращает Promise со списком поддерживаемых камер.
// This method will trigger user permissionsHtml5Qrcode.getCameras().then(cameras => { /** * devices would be an array of objects of type: * { id: "id", label: "label" } */ if (devices && devices.length) { var cameraId = devices[0].id; // .. use this to start scanning. } }).catch(err => { // handle err });Возвращаемый объект представляет собой массив Object со следующими полями:
- id: Id камеры. Это необходимо для начала сканирования QR-кода
- label: Метка для камеры. Это человекочитаемое название устройства камеры, например Front Camera или Back Camera.
Получив cameraId, вы можете выполнять операции запуска/остановки.
Запуск камеры неявно запускает сканирование QR-кода. Она работает с определенной скоростью fps (кадр в секунду), указанной в аргументе конфигурации. Это необязательное поле, и по умолчанию сканер работает со скоростью 2 fps.
Чтобы начать сканирование, необходимо создать экземпляр Html5Qrcode и вызвать API start(). Этот метод возвращает Promise, который срабатывает, когда начинается сканирование QR-кода: В реальном времени начинает отображаться лента и начинается сканирование QR-кода. Когда код обнаружен, вызывается обратный вызов qrCodeSuccessCallback, а когда он не обнаружен, вызывается обратный вызов qrCodeErrorCallback.
// Create instance of the object. The only argument is the "id" of HTML element created above.const html5QrCode = new Html5Qrcode("reader");html5QrCode.start( cameraId, // retreived in the previous step. { fps: 10, // sets the framerate to 10 frame per second qrbox: 250 // sets only 250 X 250 region of viewfinder to // scannable, rest shaded. }, qrCodeMessage => { // do something when code is read. For example: console.log(`QR Code detected: ${qrCodeMessage}`); }, errorMessage => { // parse error, ideally ignore it. For example: console.log(`QR Code no longer in front of camera.`); }) .catch(err => { // Start failed, handle it. For example, console.log(`Unable to start scanning, error: ${err}`); });Аргумент конфигурации в методе start() может влиять как на поведение сканирования, так и на пользовательский интерфейс. В данный момент есть два необязательных свойства, если они вам не нужны, вы можете просто передать пустой объект типа {}.
fps – Integer, пример = 10
Также известно как кадр в секунду. Значение по умолчанию равно 2, но его можно увеличить для более быстрого сканирования. Увеличение до очень высокого значения может повлиять на производительность. Значение >1000 просто не будет работать. Идеальным значением для этого параметра может быть 10.
qrbox – целое число, пример = 250
Используйте это свойство, чтобы ограничить область видоискателя, которую вы хотите использовать для сканирования. Остальная часть видоискателя будет затенена и проигнорирована сканером QR-кодов. Например, передав config { qrbox : 250 }, экран будет выглядеть следующим образом:
Это необязательное свойство, если ничего не передавать, то сканер будет сканировать всю область видоискателя.
Чтобы остановить сканирование, используйте метод stop()
Метод stop() в Html5Qrcode возвращает Promise, который завершается, когда видеопоток закрыт и удерживаемые ресурсы освобождены.
html5QrCode.stop().then(ignore => { // QR Code scanning is stopped. console.log("QR Code scanning stopped.");}).catch(err => { // Stop failed, handle it. console.log("Unable to stop scanning.");});Эта функция должна быть вызвана только после успешного запуска QR Code.
Для большей ясности я выложил код javascript, используемый в демонстрации, в этом gist.
Этот код использует jQuery, но он не очень нужен.
Статья взята с сайта: jsinthebits.com