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 にパラメータを渡す方法

推薦する

WeChatミニプログラムの開発をスピードアップするためのヒント

1. app.jsonを使用してページを作成する私たちの通常の開発習慣によれば、新しいページを作成す...

CSS3 グラデーション背景の互換性の問題

グラデーションの背景色を作成するときは、 linear-gradient() 関数を使用して線形グラ...

MySQL 文字列分割の例 (区切り文字なしの文字列抽出)

区切り文字なしの文字列抽出質問の要件データベース内のフィールド値:実装効果: 1行のデータを複数行に...

Ubuntu 20.04でルートアカウントを有効にする方法

Ubuntu 20.04 をインストールした後、デフォルトでは root アカウントのログイン権限が...

DockerプライベートライブラリHarborのアーキテクチャとコンポーネントの説明

この記事では、Harbor アーキテクチャの構成と、実行時に各コンポーネントを使用する方法について説...

Ubuntu 16.04 64 ビット版の VMware Tools のインストールと構成のグラフィック チュートリアル

この記事では、VMware Toolsのインストールと構成に関するグラフィックチュートリアルを参考と...

MySQL データベース トランザクション例のチュートリアル

目次1. トランザクションとは何ですか? 2. トランザクションに関連するステートメントは、挿入、削...

CentOS の起動時に RabbitMq ソフトウェアを自動的に起動する方法

1. /etc/init.dディレクトリに新しいrabbitmqを作成します。 [root@loca...

Linux で scp コマンドを使用してファイルをリモートでコピーする方法の詳細な説明

序文scp は secure copy の略です。scp は、Linux システムの ssh ログイ...

スキン効果を実現するJavaScript(背景の変更)

この記事では、スキン変更効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

MySQL 8.0.19 インストールチュートリアル

公式サイトからインストールパッケージをダウンロードします: mysql-8.0.19-linux-g...

ラムダ式の原則と例

ラムダ式ラムダ式 (クロージャとも呼ばれる) は、Java 8 のリリースを推進した最も重要な新機能...

MySQL8のパスワードを忘れた場合の簡単な解決策

序文MySQL データベースのパスワードを忘れると、データベースに正常にアクセスできなくなり、パスワ...

vue3 の setUp とリアクティブ関数の使用方法の詳細な説明

1. いつsetUpを実行するかvue3 ではメソッドを正常に使用できるようになったことは誰もが知っ...

Docker での MySQL 8.0.20 のインストールと設定のチュートリアル

Dockerは参考までにMySQLバージョン8.0.20をインストールします。具体的な内容は以下のと...