Vue verwendet Canvas-Handschrifteingabe, um Chinesisch zu erkennen

Vue verwendet Canvas-Handschrifteingabe, um Chinesisch zu erkennen

Effektbild:

Vorwort:

Kürzlich arbeitete ich an einem Großbildprojekt für den Außenbereich. Die Eingabemethode auf dem System war nicht benutzerfreundlich, daher forderte der Kunde eine Methode zur Handschrifteingabe an, die in eine Webseite eingebettet werden konnte.

Kern:

Backend-Schnittstellen-API: Verwenden Sie die QQ-Eingabemethode für die Handschriftschnittstelle

https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi

Parameter veranschaulichen Typ Standardwert
track_str Strichfolge. Einzelne Striche werden im Format „x1, y1, x2, y2, ...“ aneinandergereiht. Mehrere Striche werden im Format „eb“ auf der Grundlage einzelner Striche aneinandergereiht, zum Beispiel „x1, y1, x2, y2, eb, x3, y3, x4, y4“. Schnur -
cmd Unbekannt, aktuell 0 Nummer -

Hinweis: Diese Schnittstelle wurde aus den Artikeln anderer großer Jungs übernommen. Der Originaltext ist hier. Ich konnte die entsprechende Adresse des offiziellen Dokuments nicht finden. Wenn jemand sie kennt, hinterlassen Sie bitte eine Nachricht, um es mir mitzuteilen. Danke!

Ideen:

(1) Erstellen Sie einen Zeichenbereich auf der Leinwand

// Vorlage
<div Klasse="Canvas-Container">
 <canvas ref="canvas" width="300" height="200">Ihr Browser unterstützt Canvas nicht, bitte aktualisieren Sie Ihren Browser. </Leinwand>
</div>

// scss
.canvas-container {
 Hintergrund: #fafafa;

 Leinwand {
 Hintergrund: #fff;
  Rand: 1px durchgezogen #000;
 }
}


(2) Ermitteln der anfänglichen horizontalen und vertikalen Koordinaten

Daten() {
  zurückkehren {
    initX: 0, // anfängliche horizontale Koordinate initY: 0, // anfängliche vertikale Koordinate}
},
montiert() {
  dies.initBound()
},
Methoden: {
  // Canvas-Position initialisieren initBound() {
    let bound = this.$refs.canvas.getBoundingClientRect()
    dies.initX = gebunden.x
    dies.initY = gebunden.y
  }
}

(3) Fügen Sie Mausklickereignisse, Bewegungsereignisse und Freigabeereignisse hinzu

// Vorlage
<div Klasse="Canvas-Container">
 <canvas ref="canvas" width="300" height="200" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">Ihr Browser unterstützt Canvas nicht, bitte aktualisieren Sie Ihren Browser. </Leinwand>
</div>
// Skript
Daten() {
  zurückkehren {
    // ...
    
    lastX: 0, // vorherige horizontale KoordinatelastY: 0, // vorherige vertikale KoordinateisHandWrite: false, // ob mit der Handschrift begonnen werden sollpointsXY: [], // einzelner StrichallPointsXY: [], // alle Striche}
},
Methoden: {
  beiMausUnten(e) {
    dies.pointsXY = []
    lass cx = e.clientX - this.initX
    lass cy = e.clientY - this.initY
    dies.letztesX = cx
    dies.letztesY = cy
    dies.pointsXY.push(cx)
    dies.pointsXY.push(cy)
    this.isHandWrite = true
  },
  beiMausbewegung(e) {
    wenn (dies.istHandWrite) {
      lass cx = e.clientX - this.initX
      lass cy = e.clientY - this.initY
      dies.pointsXY.push(cx - dies.lastX)
      dies.pointsXY.push(cy - dies.lastY)
      // Holen Sie sich das 2D-Kontextobjekt let ctx = this.$refs.canvas.getContext('2d')
      // Einen neuen Pfad erstellen ctx.beginPath()
      ctx.strokeStyle = "#000"
      ctx.fillStyle = "#000"
      ctx.Linienbreite = 8
      ctx.lineCap = "rund"
      ctx.moveTo(dieses.letztesX, dieses.letztesY)
      ctx.lineTo(cx, cy)
      ctx.stroke()
      dies.letztesX = cx
      dies.letztesY = cy
    }
  },
  beiMausHoch(e) {
    wenn (dies.istHandWrite) {
      this.isHandWrite = false
      dies.allePunkteXY.push(dies.punkteXY.join(','))
      this.queryText() // Text erkennen}
  },
}


(4) Fügen Sie eine Texterkennungsschnittstelle und eine JSONP-Rückruffunktion hinzu. Vue-JSONP wird für domänenübergreifende Anforderungen verwendet. Informationen zur spezifischen Verwendung finden Sie unter Verwendung von JSONP in Vue.

// Skript
Daten() {
  zurückkehren {
    // ...
    
    write_result: [], //Gibt ähnliche Wörter zurück}
},
montiert() {
  // ...

  lass _dies = dies
  // JSONP-Rückruffunktion hinzufügen, qq-Eingabemethode spezifisch window['QQShuru'] = {
    HWPanel:
      ajax_callback: Funktion (res) {
        _this.write_result = res.cand
      },
    },
  }
},
Methoden: {
  AbfrageText() {
    let track_str = this.allPointsXY.join(',eb,')
    dies.$jsonp(
      `https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi?track_str=${track_str}&cmd=0`
    ).catch(err => {
      console.log(fehler)
    })
  },
}


(5) Fügen Sie abschließend eine Schaltfläche zum Neuschreiben hinzu, um die Leinwand zu löschen.

// Vorlage
<div>
  <button @click="onReload">Umschreiben</button>
</div>

// Skript
beimNeuladen() {
  wenn (!this.$refs.canvas) return
  dies.pointsXY = []
  dies.allePunkteXY = []
  lass ctx = dies.$refs.canvas.getContext('2d')
  ctx.clearRect(0, 0, 300, 200)
}

Der vollständige Code lautet wie folgt:

<Vorlage>
  <div id="app">
    <div Klasse="Canvas-Container">
      <canvas ref="canvas" width="300" height="200" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">Ihr Browser unterstützt Canvas nicht, bitte aktualisieren Sie Ihren Browser. </Leinwand>
    </div>
    <div>[{{ letztesX + ', ' + letztesY }}]</div>
    <div>
      <button @click="onReload">Umschreiben</button>
    </div>
    <div>Gibt ähnliche Wörter zurück: {{ write_result }}</div>
  </div>
</Vorlage>

<Skript>
Standard exportieren {
  Name: "App",
  Daten() {
    zurückkehren {
      initX: 0, // Anfangshorizontale KoordinateinitY: 0, // Anfangsvertikale KoordinatelastX: 0, // Vorherige horizontale KoordinatelastY: 0, // Vorherige vertikale KoordinateisHandWrite: false, // Ob mit der Handschrift begonnen werden sollpointsXY: [], // Einzelner StrichallPointsXY: [], // Alle Strichewrite_result: [], // Gibt ähnliche Zeichen zurück}
  },
  montiert() {
    dies.initBound()

    lass _dies = dies
    // JSONP-Rückruffunktion hinzufügen, qq-Eingabemethode spezifisch window['QQShuru'] = {
      HWPanel:
        ajax_callback: Funktion (res) {
          _this.write_result = res.cand
        },
      },
    }
  },
  Methoden: {
    // Canvas-Position initialisieren initBound() {
      let bound = this.$refs.canvas.getBoundingClientRect()
      dies.initX = gebunden.x
      dies.initY = gebunden.y
    },
    beiMausUnten(e) {
      console.log('onDown', e)
      dies.pointsXY = []
      lass cx = e.clientX - this.initX
      lass cy = e.clientY - this.initY
      dies.letztesX = cx
      dies.letztesY = cy
      dies.pointsXY.push(cx)
      dies.pointsXY.push(cy)
      this.isHandWrite = true
    },
    beiMausbewegung(e) {
      wenn (dies.istHandWrite) {
        lass cx = e.clientX - this.initX
        lass cy = e.clientY - this.initY
        dies.pointsXY.push(cx - dies.lastX)
        dies.pointsXY.push(cy - dies.lastY)
        // Holen Sie sich das 2D-Kontextobjekt let ctx = this.$refs.canvas.getContext('2d')
        // Einen neuen Pfad erstellen ctx.beginPath()
        ctx.strokeStyle = "#000"
        ctx.fillStyle = "#000"
        ctx.Linienbreite = 8
        ctx.lineCap = "rund"
        ctx.moveTo(dieses.letztesX, dieses.letztesY)
        ctx.lineTo(cx, cy)
        ctx.stroke()
        dies.letztesX = cx
        dies.letztesY = cy
      }
    },
    beiMausHoch(e) {
      wenn (dies.istHandWrite) {
        this.isHandWrite = false
        dies.allePunkteXY.push(dies.punkteXY.join(','))
        dieser.queryText()
      }
    },
    // Text erkennen queryText() {
      let track_str = this.allPointsXY.join(',eb,')
      dies.$jsonp(
        `https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi?track_str=${track_str}&cmd=0`
      ).catch(err => {
        console.log(fehler)
      })
    },
    beimNeuladen() {
      wenn (!this.$refs.canvas) return
      dies.pointsXY = []
      dies.allePunkteXY = []
      lass ctx = dies.$refs.canvas.getContext('2d')
      ctx.clearRect(0, 0, 300, 200)
    },
  },
}
</Skript>

<style lang="scss">
#app {
  Schriftfamilie: Avenir, Helvetica, Arial, serifenlos;
  -webkit-font-smoothing: Kantenglättung;
  -moz-osx-font-smoothing: Graustufen;
  Textausrichtung: zentriert;
  Farbe: #2c3e50;

  .canvas-container {
    Hintergrund: #fafafa;

    Leinwand {
      Hintergrund: #fff;
      Rand: 1px durchgezogen #000;
    }
  }
}
</Stil>

Dies ist das Ende dieses Artikels über Vue, das Canvas-Handschrifteingaben verwendet, um Chinesisch zu erkennen. Weitere relevante Vue-Inhalte, die Canvas-Handschrifteingaben verwenden, um Chinesisch zu erkennen, 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:
  • Vue verwendet Canvas, um Kreise zufälliger Größe und ohne Überlappung zu erzeugen
  • Vue verwendet Canvas, um den Bildkomprimierungs-Upload zu realisieren
  • So zeichnen Sie die Zeitleiste mit Vue+Canvas
  • VUE+Canvas realisiert den gesamten Prozess eines einfachen Gobang-Spiels
  • VUE+Canvas implementiert das Spiel God of Wealth und erhält Barren
  • So verwenden Sie VUE und Canvas, um ein Thunder Fighter-Tippspiel zu implementieren
  • VUE+Canvas implementiert den Beispielcode des Desktop-Flipper-Brick-Breaking-Spiels
  • Vue verwendet die Maus, um ein Rechteck auf Canvas zu zeichnen
  • Vue nutzt Canvas zur Implementierung mobiler handschriftlicher Signaturen
  • Vue+Canvas realisiert Puzzlespiel

<<:  Das Textdesign einer Webseite sollte aussehen wie die Kleidung von intelligenten Mädchen

>>:  So übergeben Sie Parameter über CSS an JS

Artikel empfehlen

Eine kurze Diskussion zum Problem von Daten mit Nullwerten in der MySQL-Datenbank

Standardmäßig akzeptiert MySQL das Einfügen von 0...

Detaillierte Erläuterung der JavaScript-Programmschleifenstruktur

Inhaltsverzeichnis Struktur auswählen Schleifenst...

Detaillierte Erklärung der Eigenschaften und Funktionen von Vuex

Inhaltsverzeichnis Was ist Vuex? Fünf Eigenschaft...

Lernen, React-Gerüste zu bauen

1. Komplexität des Front-End-Engineerings Wenn wi...

Beispielcode zum Konvertieren von HTML-Tabellendaten in das JSON-Format

Die Javascript-Funktion zum Konvertieren von <t...

Vue implementiert die Tabellenpaging-Funktion

In diesem Artikelbeispiel wird der spezifische Co...

js kehrt zur vorherigen Seite zurück und aktualisiert den Code

1. Javascript kehrt zur vorherigen Seite zurück hi...

Detaillierte Erklärung der MySQL-Dreiwertelogik und NULL

Inhaltsverzeichnis Was ist NULL Zwei Arten von NU...

Detaillierte Erklärung zur Verwendung von React.cloneElement

Inhaltsverzeichnis Die Rolle von cloneElement Anw...

Basiswissen: Was bedeutet http vor einer Website-Adresse?

Was ist HTTP? Wenn wir eine Website durchsuchen m...

Verwendung der MySQL SHOW STATUS-Anweisung

Um die Leistung von MySQL anzupassen und den Dien...

Grundlegende Verwendung von Javascript-Array-Includes und -Reduces

Inhaltsverzeichnis Vorwort Array.Prototyp.enthält...

Bedingte Kommentare zur Bestimmung des Browsers (IE-Reihe)

<!--[if IE 6]> Nur IE6 kann erkennen <![e...

CSS implementiert problemlos Container auf Blockebene mit festem Verhältnis

Beim Entwerfen eines H5-Layouts werden Sie normal...

Details zu Linux-Dateideskriptoren, Dateizeigern und Inodes

Inhaltsverzeichnis Linux - Dateideskriptor, Datei...