HintergrundVor nicht allzu langer Zeit habe ich eine Funktion zum Abrufen der Browserkamera und zum Scannen der Codeerkennung erstellt. Dieser Artikel sortierte die beteiligten Wissenspunkte und die spezifische Codeimplementierung und organisierte sie in den Inhalt dieses Artikels. In diesem Artikel wird hauptsächlich die Verwendung der auf dem Ergebnisse erzielenIn diesem Beispiel gibt es zwei Hauptseiten: die Homepage und die Seite zum Scannen des QR-Codes. Der spezifische Implementierungseffekt ist in der folgenden Abbildung dargestellt.
Online-Erfahrung: https://dragonir.github.io/h5-scan-qrcode Tipp: Sie müssen im Hochformat in einem Browser mit einem Kameragerät darauf zugreifen. Weitere Tipps zur horizontalen und vertikalen Bildschirmerkennung von Mobiltelefonen finden Sie in meinem anderen Artikel „Front-End-Wissen im Gokudō-Spiel“. Technische EinführungWebRTC-API WebRTC (Web Real-Time Communications) ist eine Echtzeit-Kommunikationstechnologie, die es Netzwerkanwendungen oder Sites ermöglicht, ohne die Hilfe eines Vermittlers Drei Hauptschnittstellen:
WebRTC-Adapter Obwohl die Kern-API Die Webseite muss Es gibt ein navigator.mediaDevices.getUserMedia(Einschränkungen) .dann(Funktion(Stream) { // Diesen Stream verwenden }) .catch(Funktion(Fehler) { // Fehler behandeln }) QR-Code-Analysebibliothek Wenn Sie einen Webcam-Stream mit const code = jsQR(imageData, Breite, Höhe, Optionen); wenn (Code) { console.log('QR-Code gefunden!', Code); } Code-ImplementierungVerfahren Der gesamte Code-Scanvorgang ist in der folgenden Abbildung dargestellt: Die Seite wird initialisiert. Zuerst wird geprüft, ob der Browser die Der folgende Inhalt unterteilt den Prozess und implementiert jeweils die entsprechenden Funktionen. Seitenstruktur Schauen wir uns zunächst die Seitenstruktur an, die im Wesentlichen aus
<Vorlage> <div Klasse="Scanner" ref="Scanner"> <!-- Eingabeaufforderungsfeld: wird verwendet, um Eingabeaufforderungen in inkompatiblen Browsern anzuzeigen--> <div Klasse="Banner" v-if="showBanner"> <i class="close_icon" @click="() => showBanner = false"></i> <p class="text">Wenn der aktuelle Browser den Code nicht scannen kann, wechseln Sie bitte zu einem anderen Browser und versuchen Sie es</p> </div> <!-- Scancode-Feld: Scancode-Animation anzeigen--> <div Klasse="Abdeckung"> <p Klasse="Zeile"></p> <span class="Quadrat oben links"></span> <span class="Quadrat oben rechts"></span> <span class="Quadrat unten rechts"></span> <span class="Quadrat unten links"></span> <p class="tips">Legen Sie den QR-Code in das Feld ein und er wird automatisch gescannt</p> </div> <!-- Videostream-Anzeige --> <Video v-show="Wiedergeben anzeigen" Klasse="Quelle" ref="Video" :Breite="videoWH.Breite" :Höhe="videoWH.Höhe" Bedienelemente ></video> <canvas v-show="!showPlay" ref="canvas" /> <button v-show="showPlay" @click="run">Starten</button> </div> </Vorlage> Methode: Zeichnen
// Zeichne eine Linie drawLine (beginn, Ende) { dies.canvas.beginPath(); dies.canvas.moveTo(begin.x, begin.y); dies.canvas.lineTo(end.x, end.y); diese.canvas.lineWidth = diese.lineWidth; dies.canvas.strokeStyle = diese.lineColor; dies.canvas.stroke(); }, // drawBox (Standort) { wenn (dies.drawOnfound) { dies.drawLine(Standort.oberelinkeEcke, Standort.obererechteEcke); this.drawLine(Standort.obereRechteEcke, Standort.untereRechteEcke); dies.drawLine(standort.untereRechteEcke,standort.untereLinkeEcke); dies.drawLine(Standort.unterelinkeEcke, Standort.oberelinkeEcke); } }, Methode: Initialisierung
// Initialisierung setup () { // Bestimmen Sie, ob der Browser die an MediaDevices.getUserMedia() gemountete Methode unterstützt, wenn (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { dieser.vorherigerCode = null; diese.parität = 0; dies.aktiv = wahr; dies.canvas = dies.$refs.canvas.getContext("2d"); // Kameramodus abrufen. Die Standardeinstellung ist die Rückkamera const facingMode = this.useBackCamera ? { exact: 'environment' } : 'user'; // Kamera-Videoverarbeitung const handleSuccess = stream => { wenn (this.$refs.video.srcObject !== undefiniert) { dies.$refs.video.srcObject = Stream; } sonst wenn (window.videoEl.mozSrcObject !== undefiniert) { dies.$refs.video.mozSrcObject = Stream; } sonst wenn (window.URL.createObjectURL) { dies.$refs.video.src = Fenster.URL.createObjectURL(Stream); } sonst wenn (window.webkitURL) { dies.$refs.video.src = Fenster.webkitURL.createObjectURL(Stream); } anders { dies.$refs.video.src = Stream; } // Wenn Sie nicht möchten, dass der Benutzer den Fortschrittsbalken zieht, können Sie direkt das Attribut „playsinline“ verwenden, das Webkit-Attribut „playsinline“ this.$refs.video.playsInline = true; const playPromise = this.$refs.video.play(); playPromise.catch(() => (this.showPlay = true)); //Scannen Sie den Code regelmäßig zur Identifizierung, wenn die Videowiedergabe beginntplayPromise.then(this.run); }; // Videostream erfassen navigator.mediaDevices .getUserMedia({ video: { facingMode } }) .then(HandleErfolg) .fangen(() => { navigator.mediaDevices .getUserMedia({ video: true }) .then(HandleErfolg) .catch(Fehler => { dies.$emit("Fehler erfasst", Fehler); }); }); } }, Methode: Periodisches Scannen laufen () { wenn (dies.aktiv) { // Der Browser ruft die Scan-Methode requestAnimationFrame(this.tick) in einer Schleife vor dem nächsten Neuzeichnen auf; } }, Methode: Erfolgsrückruf // QR-Code-Erkennung erfolgreich, Ereignisverarbeitung gefunden (Code) { wenn (dieser.vorherigerCode !== code) { dieser.vorherigerCode = Code; } sonst wenn (dieser.vorherigerCode === Code) { diese.parität += 1; } wenn (diese.Parität > 2) { this.active = this.stopOnScanned ? false : wahr; diese.parität = 0; dies.$emit("Code gescannt", Code); } }, Methode: Stopp // Punkt fullStop () { wenn (dieses.$refs.video && dieses.$refs.video.srcObject) { // Stoppen Sie die Video-Stream-Sequenzverfolgung this.$refs.video.srcObject.getTracks().forEach(t => t.stop()); } } Methode: Scannen
// Periodisches Scannen und Erkennen des Codes tick () { // Das Video befindet sich in der Vorbereitungsphase und hat genügend Daten geladen, wenn (this.$refs.video && this.$refs.video.readyState === this.$refs.video.HAVE_ENOUGH_DATA) { // Beginnen Sie, das Video auf der Leinwand zu zeichnen. this.$refs.canvas.height = this.videoWH.height; dies.$refs.canvas.width = dies.videoWH.width; dies.canvas.drawImage(dieses.$refs.video, 0, 0, dies.$refs.canvas.width, dies.$refs.canvas.height); // getImageData() kopiert die Pixeldaten des angegebenen Rechtecks auf die Leinwand const imageData = this.canvas.getImageData(0, 0, this.$refs.canvas.width, this.$refs.canvas.height); lass Code = false; versuchen { // QR-Code erkennen code = jsQR(imageData.data, imageData.width, imageData.height); } fangen (e) { konsole.fehler(e); } // Wenn der QR-Code erkannt wird, zeichne ein rechteckiges Kästchen if (code) { dies.drawBox(code.location); // Erfolgreiche Ereignisverarbeitung identifizieren this.found(code.data); } } dies.laufen(); }, Übergeordnete Komponente Die übergeordnete Komponente des Seitenstruktur <Vorlage> <div Klasse="scan"> <!-- Seitennavigationsleiste--> <div Klasse="nav"> <a class="schließen" @click="() => $router.go(-1)"></a> <p class="title">QR-Code scannen</p> </div> <div Klasse="Scroll-Container"> <!-- Unterkomponente des Scancodes--> <Scanner v-on:code-scanned="Code gescannt" v-on:error-captured="Fehler erfasst" :Stopp beim Scannen="true" :draw-on-found="wahr" :responsive="false" /> </div> </div> </Vorlage> Methode der übergeordneten Komponente importiere Scaner aus „../components/Scaner“; Standard exportieren { Name: 'Scannen', Komponenten: Scanner }, Daten () { zurückkehren { Fehlermeldung: "", gescannt: "" } }, Methoden: { codeGescannt(code) { dies.gescannt = Code; setzeTimeout(() => { alert(`Code scannen und erfolgreich analysieren: $[code]`); }, 200) }, Fehler erfasst (Fehler) { Schalter (Fehlername) { Fall „Nicht zulässiger Fehler“: this.errorMessage = "Kameraberechtigung verweigert."; brechen; Fall „Nicht gefundener Fehler“: this.errorMessage = "Es ist keine Kamera angeschlossen."; brechen; Fall „Nicht unterstützter Fehler“: diese.Fehlernachricht = "Diese Seite scheint in einem nicht sicheren Kontext bereitgestellt zu werden."; brechen; Fall „Nicht lesbar“: diese.Fehlernachricht = "Auf Ihre Kamera konnte nicht zugegriffen werden. Wird sie bereits verwendet?"; brechen; Fall „Überbeschränkter Fehler“: this.errorMessage = "Die Einschränkungen stimmen mit keiner installierten Kamera überein."; brechen; Standard: this.errorMessage = "UNBEKANNTER FEHLER: " + error.message; } Konsole.Fehler(diese.Fehlernachricht); alert('Kameraaufruf fehlgeschlagen'); } }, montiert () { var str = navigator.userAgent.toLowerCase(); var ver = str.match(/cpu iphone os (.*?) wie mac os/); // Nach dem Testen kann die Kamera auf Systemen unter iOS 10.3.3 nicht erfolgreich aufgerufen werden if (ver && ver[1].replace(/_/g,".") < '10.3.3') { alert('Kameraaufruf fehlgeschlagen'); } } Vollständiger Code ZusammenfassenAnwendungserweiterungen Ich denke, dass die folgenden Funktionen durch Aufrufen der Kamera und Scannen und Identifizieren über den Browser realisiert werden können. Welche anderen
Kompatibilität
Verweise [1]. Aufnehmen von Standbildern mit WebRTC [2]. Kameraauswahl in JavaScript mit der mediaDevices API [3]. So verwenden Sie JavaScript, um auf die Vorder- und Rückkameras eines Geräts zuzugreifen Autor: dragonir Artikel-URL: https://www.cnblogs.com/dragonir/p/15405141.html Dies ist das Ende dieses Artikels über die Implementierung der browserseitigen Code-Scan-Funktion von Vue. Weitere relevante Inhalte zum Code-Scannen im Vue-Browser finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: So installieren Sie OpenJDK in Docker und führen das JAR-Paket aus
Grundbegriffe des Konsuls Servermodus und Clientm...
Vorwort Im aktuellen JavaScript gibt es kein Konz...
Wir verwenden Klickereignisse häufig im A-Tag: 1. ...
Wenn bei der Verarbeitung von Batch-Updates besti...
Hier können Sie durch geschickten Einsatz von CSS-...
Beim Anwenden von Docker-Containern mounten wir h...
Batchkommentare in SQL Server Batch-Annotation St...
Es gibt viele Gründe für den Export von MySQL-Dat...
Dieser Artikel beschreibt die Linux-Dateiverwaltu...
Mir war langweilig und plötzlich fiel mir die Impl...
1. Befehlseinführung Mit dem Befehl ln werden Lin...
In diesem Artikel wird der spezifische Code von N...
In diesem Artikelbeispiel wird der spezifische Co...
1. Rufen Sie das Virtualisierungscenter auf, meld...
So lösen Sie das Problem des Vergessens des Root-...