Vueはキャンバスの手書き入力を使用して中国語を認識します

Vueはキャンバスの手書き入力を使用して中国語を認識します

効果画像:

序文:

最近、屋外の大画面プロジェクトに取り組んでいました。システムの入力方法は使いにくかったため、顧客は Web ページに埋め込むことができる手書き入力方法を要求しました。

コア:

バックエンドインターフェースAPI: QQ入力方式の手書きインターフェースを使用する

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

パラメータ例示するタイプデフォルト値
トラック文字列ストローク文字列。単一のストロークは、「x1、y1、x2、y2、...」の形式で連結されます。複数のストロークは、単一のストロークを基準とした eb の形式で連結されます。たとえば、「x1、y1、x2、y2、eb、x3、y3、x4、y4」です。-
コマンド不明、現在 0番号-

注:このインターフェースは他の大物の記事から学びました。原文はここにあります。公式文書の関連アドレスを見つけることができませんでした。どなたかご存知の方がいらっしゃいましたら、メッセージを残して教えてください。ありがとうございます!

アイデア:

(1)キャンバス描画領域を作成する

// テンプレート
<div class="canvas-container">
 <canvas ref="canvas" width="300" height="200">ブラウザはキャンバスをサポートしていません。ブラウザをアップグレードしてください。 </キャンバス>
</div>

// SCSS で
.キャンバスコンテナ{
 背景: #fafafa;

 キャンバス {
 背景: #fff;
  境界線: 1px実線 #000;
 }
}


(2)初期の水平座標と垂直座標の取得

データ() {
  戻る {
    initX: 0, // 初期水平座標 initY: 0, // 初期垂直座標}
},
マウント() {
  このメソッドは、
},
メソッド: {
  // キャンバスの位置を初期化する initBound() {
    バインド = this.$refs.canvas.getBoundingClientRect()
    this.initX = bound.x
    this.initY = 境界.y
  }
}

(3)マウスクリックイベント、移動イベント、リリースイベントを追加する

// テンプレート
<div class="canvas-container">
 <canvas ref="canvas" width="300" height="200" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">ブラウザはキャンバスをサポートしていません。ブラウザをアップグレードしてください。 </キャンバス>
</div>
// スクリプト
データ() {
  戻る {
    // ...
    
    lastX: 0, // 前の水平座標lastY: 0, // 前の垂直座標isHandWrite: false, // 手書きを開始するかどうかpointsXY: [], // 単一のストロークallPointsXY: [], // すべてのストローク}
},
メソッド: {
  マウスダウン時(e) {
    this.pointsXY = []
    cx = e.clientX - this.initX とします。
    cy = e.clientY - this.initY とします。
    this.lastX = cx
    this.lastY = cy
    this.pointsXY.push(cx)
    this.pointsXY.push(cy)
    this.isHandWrite = true
  },
  マウスを動かすと(e) {
    if (this.isHandWrite) {
      cx = e.clientX - this.initX とします。
      cy = e.clientY - this.initY とします。
      this.pointsXY.push(cx - this.lastX)
      this.pointsXY.push(cy - this.lastY)
      // 2D コンテキスト オブジェクトを取得します。let ctx = this.$refs.canvas.getContext('2d')
      // 新しいパスを作成する ctx.beginPath()
      ctx.strokeStyle = '#000'
      ctx.fillStyle = '#000'
      ctx.lineWidth = 8
      ctx.lineCap = '丸'
      ctx.moveTo(this.lastX, this.lastY)
      ctx.lineTo(cx, cy)
      ctx.ストローク()
      this.lastX = cx
      this.lastY = cy
    }
  },
  マウスを離すと(e) {
    if (this.isHandWrite) {
      this.isHandWrite = false
      this.allPointsXY.push(this.pointsXY.join(','))
      this.queryText() // テキストを認識する}
  },
}


(4) テキスト認識インターフェースとjsonpコールバック関数を追加します。Vue-jsonpはクロスドメインリクエストに使用されます。具体的な使用方法については、vueでのjsonpの使用を参照してください。

// スクリプト
データ() {
  戻る {
    // ...
    
    write_result: [], // 類似の単語を返す}
},
マウント() {
  // ...

  _this = this とします
  // jsonpコールバック関数を追加、qq入力メソッド固有 window['QQShuru'] = {
    HWPanel:
      ajax_callback: 関数 (res) {
        _this.write_result = res.cand
      },
    },
  }
},
メソッド: {
  クエリテキスト() {
    track_str = this.allPointsXY.join(',eb,') とします。
    これ.$jsonp(
      `https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi?track_str=${track_str}&cmd=0`
    ).catch(エラー => {
      コンソール.log(エラー)
    })
  },
}


(5)最後に、キャンバスをクリアするための書き換えボタンを追加します。

// テンプレート
<div>
  <button @click="onReload">書き換え</button>
</div>

// スクリプト
onReload() {
  if (!this.$refs.canvas) 戻り値
  this.pointsXY = []
  this.allPointsXY = []
  ctx = this.$refs.canvas.getContext('2d') とします。
  ctx.clearRect(0, 0, 300, 200)
}

完全なコードは次のとおりです。

<テンプレート>
  <div id="アプリ">
    <div class="canvas-container">
      <canvas ref="canvas" width="300" height="200" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp">ブラウザはキャンバスをサポートしていません。ブラウザをアップグレードしてください。 </キャンバス>
    </div>
    <div>[{{ lastX + ', ' + lastY }}]</div>
    <div>
      <button @click="onReload">書き換え</button>
    </div>
    <div>類似の単語を返す: {{ write_result }}</div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'アプリ'、
  データ() {
    戻る {
      initX: 0, // 初期水平座標initY: 0, // 初期垂直座標lastX: 0, // 前の水平座標lastY: 0, // 前の垂直座標isHandWrite: false, // 手書きを開始するかどうかpointsXY: [], // 単一のストロークallPointsXY: [], // すべてのストロークwrite_result: [], // 類似の文字を返す}
  },
  マウント() {
    このメソッドは、

    _this = this とします
    // jsonpコールバック関数を追加、qq入力メソッド固有 window['QQShuru'] = {
      HWPanel:
        ajax_callback: 関数 (res) {
          _this.write_result = res.cand
        },
      },
    }
  },
  メソッド: {
    // キャンバスの位置を初期化する initBound() {
      バインド = this.$refs.canvas.getBoundingClientRect()
      this.initX = bound.x
      this.initY = 境界.y
    },
    マウスダウン時(e) {
      コンソールログ('onDown', e)
      this.pointsXY = []
      cx = e.clientX - this.initX とします。
      cy = e.clientY - this.initY とします。
      this.lastX = cx
      this.lastY = cy
      this.pointsXY.push(cx)
      this.pointsXY.push(cy)
      this.isHandWrite = true
    },
    onMouseMove(e) {
      if (this.isHandWrite) {
        cx = e.clientX - this.initX とします。
        cy = e.clientY - this.initY とします。
        this.pointsXY.push(cx - this.lastX)
        this.pointsXY.push(cy - this.lastY)
        // 2D コンテキスト オブジェクトを取得します。let ctx = this.$refs.canvas.getContext('2d')
        // 新しいパスを作成する ctx.beginPath()
        ctx.strokeStyle = '#000'
        ctx.fillStyle = '#000'
        ctx.lineWidth = 8
        ctx.lineCap = '丸'
        ctx.moveTo(this.lastX, this.lastY)
        ctx.lineTo(cx, cy)
        ctx.ストローク()
        this.lastX = cx
        this.lastY = cy
      }
    },
    マウスを離すと(e) {
      if (this.isHandWrite) {
        this.isHandWrite = false
        this.allPointsXY.push(this.pointsXY.join(','))
        this.queryText()
      }
    },
    // テキストを認識する queryText() {
      track_str = this.allPointsXY.join(',eb,') とします。
      これ.$jsonp(
        `https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi?track_str=${track_str}&cmd=0`
      ).catch(エラー => {
        コンソール.log(エラー)
      })
    },
    onReload() {
      if (!this.$refs.canvas) 戻り値
      this.pointsXY = []
      this.allPointsXY = []
      ctx = this.$refs.canvas.getContext('2d') とします。
      ctx.clearRect(0, 0, 300, 200)
    },
  },
}
</スクリプト>

<スタイル lang="scss">
#アプリ {
  フォントファミリー: Avenir、Helvetica、Arial、sans-serif;
  -webkit-font-smoothing: アンチエイリアス;
  -moz-osx-font-smoothing: グレースケール;
  テキスト配置: 中央;
  色: #2c3e50;

  .キャンバスコンテナ{
    背景: #fafafa;

    キャンバス {
      背景: #fff;
      境界線: 1px実線 #000;
    }
  }
}
</スタイル>

これで、キャンバスの手書き入力を使用して中国語を認識する vue に関するこの記事は終了です。キャンバスの手書き入力を使用して中国語を認識する vue に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • VueはCanvasを使用してランダムなサイズで重なり合わない円を生成します
  • Vueはキャンバスを使用して画像圧縮アップロードを実現します
  • vue+canvasでタイムラインを描く方法
  • VUE+CanvasはシンプルなGobangゲームの全プロセスを実現します
  • VUE+Canvasは、インゴットを受け取る富の神のゲームを実装します
  • VUE と Canvas を使用して Thunder Fighter タイピング ゲームを実装する方法
  • VUE+Canvasはデスクトップピンボールブロック破壊ゲームのサンプルコードを実装します
  • Vueはマウスを使ってキャンバス上に四角形を描きます
  • Vueはキャンバスを使用してモバイル手書き署名を実装します
  • Vue+canvasでパズルゲームを実現

<<:  Linuxのシグナルメカニズムについての簡単な説明

>>:  CSS 経由で JS にパラメータを渡す方法

推薦する

MySQL データベースの基礎を始めるための一般的なコマンドの概要

この記事では、MySQL データベースの基礎を学ぶためによく使用されるコマンドを例を使って説明します...

get メソッドによる HTML フォームの値転送の例

google.htmlインターフェースは図の通りですコードは図のとおりです: (比較的シンプルで、入...

vagrant+virtualBoxで仮想マシンを構築する方法

1. はじめにVagrant は、仮想マシン (VirtualBox) を構築および管理するためのツ...

Ajax jQueryはページ上のdivの更新効果を実現します

元のコードは次のとおりです。 <div class='コントロールグループ'&...

MySQLのテーブル構造を変更する際に知っておきたいメタデータロックの詳しい解説

序文MySQL を扱ったことがある人なら、テーブル メタデータ ロックの待機についてよく知っているは...

Nginx リバース プロキシと負荷分散の実践

リバースプロキシリバースプロキシとは、プロキシサーバーを介してユーザーのアクセス要求を受信し、ユーザ...

Vueのライブ放送機能の詳しい説明

最近、会社でたまたま生放送をしていたのですが、今日は私が遭遇した落とし穴を記録します。会社のサーバー...

ElementUI el-select の過剰なデータに対する解決策についての簡単な説明

目次1. シナリオの説明2. 解決策オプションが多すぎる el-select コンポーネントの解決策...

画像の一時停止を実現するjQueryプラグイン

この記事では、画像の一時停止を実現するためのjQueryプラグインの具体的なコードを参考までに共有し...

MySQL レプリケーション テーブルの詳細とサンプル コード

MySQL レプリケーション テーブルの詳細な説明テーブル構造、インデックス、デフォルト値などを含む...

スクロールバーの美化効果を実現するための CSS3 のサンプル コード

具体的なコードは次のとおりです。 /*スクロールバーの幅*/ ::-webkit-スクロールバー{ ...

WeChatアプレット開発で遭遇したことのない落とし穴のまとめ

目次getApp()ページエントリファイルの先頭に変数を定義しますwx.createSelector...

MySqlはページクエリ機能を実装します

まず、ページ分割クエリを使用する理由を明確にする必要があります。データが膨大なため、すべてのデータを...