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
Vier Netzwerktypen: Keine: Konfigurieren Sie kein...
Lebenszyklusklassifizierung Jede Komponente von V...
Tipps zur Verwendung von Docker 1. Bereinigen Sie...
Inhaltsverzeichnis 1. React kombiniert mit Antd, ...
1. Einführung in MySQL-Berechtigungen Es gibt 4 T...
Docker ist eine Open-Source-Engine, mit der sich ...
1. Docker mountet das lokale Verzeichnis Docker k...
einführen Durch das Einrichten einer Lese-/Schrei...
Zusammenfassung: Viele Unternehmen, sogar die meis...
Inhaltsverzeichnis Der Ursprung von JSBridge Das ...
Die Echtzeitreplikation ist die wichtigste Method...
Dieser Artikel zeichnet das Installations-Grafik-...
Verwandte Artikel: Anfänger lernen einige HTML-Ta...
Inhaltsverzeichnis Methoden des String-Objekts Me...
Die Standardvorlagenmethode ähnelt vue2 und verwe...