Vueのウェブページスクリーンショット機能の詳しい説明

Vueのウェブページスクリーンショット機能の詳しい説明

最近、プロジェクトで写真をアップロードする要件があるのですが、顧客がアップロードする写真のサイズがまちまちなので、顧客の写真の比率を規定する必要があり、顧客が求めているものにする必要があるため、スクリーンショットを撮ることを思いつきました。

成果を達成する

私たちのアーキテクチャはvueなので、vueスクリーンショットプラグインを使用します

プラグインをインストールします: npm install vue-cropper --save-dev

コンポーネントのインポート

 'vue' から Vue をインポートします。
 「vue-cropper」から VueCropper をインポートします。

 Vue.use(VueCropper)

コアコード

 <div>
            <span class="spanStyle">製品画像:</span>
            <!--画像プレビュー div 全体-->
            <div style="display:flex;padding-left: 300px;">
              <div class="info-item" style="flex:1;margin-left:-160px;margin-top: -25px">
                <label class="btn btn-orange theme-bg-gray theme-white w90" for="uploads" style="display:inline-block;width: 70px;padding: 0;text-align: center;line-height: 28px;" >画像を選択</label>
                <input type="file" id="uploads" :value="imgFile" style="position:absolute; clip:rect(0 0 0 0);" accept="image/png, image/jpeg, image/gif, image/jpg" @change="uploadImg($event, 1)">
                <div class="line" style="margin-left: -280px;margin-top: 85px;">
                  <div class="cropper-content" style="margin-top:-60px;margin-left:160px;">
                    <div class="cropper">
                      <vueクロッパー
                        ref="クロッパー"
                        :img="オプション.img"
                        :outputSize="オプションのサイズ"
                        :outputType="オプション.outputType"
                        :info="true"
                        :full="オプション.full"
                        :canMove="オプション.canMove"
                        :canMoveBox="オプション.canMoveBox"
                        :original="オプション.original"
                        :autoCrop="オプション.autoCrop"
                        :autoCropWidth="option.autoCropWidth"
                        :autoCropHeight="option.autoCropHeight"
                        :fixedBox="オプション.fixedBox"
                        @realTime="実時間"
                      </vueクロッパー>
                    </div>
                    <!-- キャプチャした画像は div 内に表示されます -->
                    <div style="margin-left:700px;">
                      <div class="show-preview" :style="{'width': '300px', 'height':'150px', 'overflow': 'hidden', 'margin-left': '-650px'}">
                        <div :style="previews.div" >
                          <img :src="previews.url" :style="previews.img">
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>

プレビュー方法

データ (){
	戻る {
		 ヘッドイメージ:''、
                //画像を切り取ってアップロードする: false,
                プレビュー: {},
                オプション: {
                    画像: ''、
                    outputSize:1, //カット後の画質(0.1-1)
                    full: false, // 元の画像スケールのスクリーンショットを出力 props name full
                    出力タイプ: 'png',
                    移動可能: true、
                    オリジナル: 偽、
                    canMoveBox: true、
                    自動トリミング: true、
                    自動クロップ幅: 300,
                    自動クロップ高さ: 150,
                    固定ボックス: true
                },
                fileName:'', //ローカルファイルアドレス downImg: '#',
                画像ファイル:'',
                uploadImgRelaPath:'', //アップロードされた画像のアドレス(サーバードメイン名なし)
	}
},
方法:{
	// リアルタイムプレビュー関数 realTime(data) {
       コンソールログ('リアルタイム')
       this.previews = データ
   },
   //ローカル画像を選択 uploadImg(e, num) {
       コンソールにログを出力します。
       var _this = これ;
       // 画像をアップロード var file = e.target.files[0]
       _this.fileName = ファイル名;
       if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {
           alert('画像タイプは .gif、jpeg、jpg、png、bmp のいずれかである必要があります')
           偽を返す
       }
       var リーダー = 新しい FileReader();
       リーダー.onload = (e) => {
           データを入力します。
           if (typeof e.target.result === 'object') {
               // 配列バッファを BLOB に変換します。base64 の場合は必要ありません。data = window.URL.createObjectURL(new Blob([e.target.result]))
           }
           それ以外 {
               データ = e.target.result
           }
           数値 === 1 の場合
               _this.option.img = データ
           } そうでなければ (num === 2) {
               _this.example2.img = データ
           }
       }
       // // blob に変換
       reader.readAsArrayBuffer(ファイル);
   }
}
 

次に、キャプチャ後の画像を取得する必要があり、その画像を取得するために Cropper のコールバック関数を使用します。ここでは、BLOB 形式に変換した画像を取得します (変換しないと表示できません)
これは、バックエンドがデータをファイル タイプとして受信するため、BLOB をファイルに変換し、formData を使用してファイルをアップロードする必要があるためです。

製品追加(){
this.$refs.cropper.getCropBlob((データ) => {
	  //このデータは、私たちが傍受した BLOB 画像です。let formData = new FormData();
	  //ファイル名を取得します。ファイル変換ではこれを使用できないため、変数を使用して割り当てる必要があります。var name=this.fileName
       var file = new File([data], name, {type: data.type, lastModified: Date.now()});
       formData.append("ファイル",ファイル)
       新しい Promise((resolve, 拒否) => {
           productAdd(formData).then(レスポンス => {
               (レスポンスコード == 20000)の場合{
                   ダイアログ.アラート({
                       タイトル: 「ヒント」
                       メッセージ: '正常に保存されました! '
                   }).then(() => {
                       this.back('/productInfo')
                   });

               }
           }).catch(エラー => {
               拒否(エラー)
           })
       })
   })
}

写真を編集してエコーしたり、複数のカット写真をアップロードしたりするなど、実際に自分のプロジェクトに適用するときにはまだ修正が必要です。

上記は、Vue の Web ページ スクリーンショット機能の実装の詳細説明の詳細な内容です。Vue Web ページ スクリーンショットの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue を使用して Web ページのスクリーンショットを撮る方法をご存知ですか?

<<:  要素に丸い境界線を追加する border-radius メソッド

>>:  MySQL ifnull のネスト使用手順

推薦する

Linuxにgitをインストールする方法

1. はじめにGit は、規模の大小を問わずあらゆるプロジェクトを俊敏かつ効率的に処理するために使用...

JSON.stringify を使用する際に発生する循環参照の問題を解決する方法の詳細な説明

プログラマーが日常的に TypeScript/JavaScript 開発を行う場合、複雑な Java...

zabbix 4.04 の詳細なインストール チュートリアル (CentOS 7.6 ベース)

1. インストール前の準備: 1.1 JDKをインストールするopenjdkをアンインストールする...

HTML の div と span の違い (共通点と相違点)

共通点: DIV タグと SPAN タグは、コンテンツ全体を非表示にしたり、コンテンツ全体を移動した...

MySQL の単一テーブル クエリ操作例の詳細な説明 [構文、制約、グループ化、集計、フィルタリング、並べ替えなど]

この記事では、MySQL の単一テーブル クエリ操作について説明します。ご参考までに、詳細は以下の通...

Dockerサーバーのストレージリソースプール不足問題の解決

目次1. 問題の説明2. 問題分析3. 問題解決1. Dockerのディスク使用量を確認する2. 再...

シームレスなカルーセル効果を実現するネイティブ js

参考までに、ネイティブjsでカルーセル効果(シームレススクロール)を実現しています。具体的な内容は以...

vue-router のハッシュモードと履歴モードの違い

vue-routerには2つのモードがありますハッシュモード履歴モード1. シングルページアプリケー...

CentOS7 は Docker のバージョン 19 をデプロイします (簡単なので、従ってください)

1. 依存パッケージをインストールする [root@localhost ~]# yum insta...

MySQL における tinyint と int の違いの詳細な説明

質問: int(1) と tinyint(1) の違いは何ですか?このような設計では、いずれにしても...

node.js で PC 上の WeChat アプレット パッケージを復号化するための処理アイデア

目次アプレットのソースコードはどこにありますか? PC ミニプログラムはどのように暗号化されますか?...

MySQLで日付を比較する方法の詳細な説明

データ型が datetime であるフィールド add_time を持つテーブル product が...

MySQL 8.0 以降の一般的なコマンドの詳細な説明

リモートアクセスを有効にする次のコマンドを実行して、root ユーザーのリモート アクセス権を有効に...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...