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 のネスト使用手順

推薦する

JavaScript カウントダウン プロンプト ボックス

この記事の例では、カウントダウンプロンプトボックスを実装するためのJavaScriptの具体的なコー...

トピックページデザインの 5 つの基本スキル (Alibaba UED Shanmu)

このトピックは、2012 年後半の社内共有です。まだ記事にはなっていませんが、春節が近づいているので...

Webpack3+React16コード分割の実装

プロジェクトの背景最近、webpackのバージョンが古いプロジェクトがあります。 リーダー層では今の...

Windows システムに mysql5.7.21 をインストールするための詳細なチュートリアル

MySQL インストーラーは、MySQL ソフトウェアのあらゆるニーズに対応する、使いやすいウィザー...

複数のフィールドを変更するためのMysql更新の構文の詳細な分析

MySQL でレコードを更新すると、構文は正しいのですが、レコードが更新されません...質問文実行前...

Dockerボリュームのファイルマッピング方法

背景ブロックチェーン ログ モジュールで作業しているときに、コンテナーが実行されている場合は、ログ ...

Vue で動的に読み込まれたローカル画像を処理する方法

問題を見つける今日は、vue ファイルにローカル画像を導入する際に問題が発生したので、この記事を書き...

純粋な CSS3 でモバイルの拡大と縮小の効果を実装するためのサンプル コード

この記事では、純粋な CSS3 を使用してモバイル端末での展開と折りたたみの効果を実装するサンプルコ...

MySQL で 2 つのセットの交差/差/和を取得する方法

MySQL の一般的なシナリオ: 2 つのデータ セットの交差と差を取得するステップ1. 2つのコレ...

バランスの取れたデジタルスクロール効果を実現するJavaScript

目次1. 実施の背景2. 実装のアイデア3. 実施プロセス1. 実施の背景先週、ユーザーがタスクを完...

MySQL 文字列連結と null 値の設定のためのインスタンス メソッド

#文字列連結 concat(s1,s2); テーブル内の last_name と first_nam...

WeChatアプレットが複数行テキストのスクロール効果を実現

この記事の例では、WeChatアプレットで複数行のテキストスクロールを実装するための具体的なコードを...

Dockerがコンテナを作成した後にホスト名を変更する詳細なプロセス

後悔を癒す薬は世の中にある、考えてみる気さえあれば!コンテナを再作成する必要はもうありません。 m2...

リソースアップロード機能を実現するための SpringBoot+nginx の詳細な例

最近、画像、ビデオ、CSS/JS などの静的リソースを配置するために nginx を使用する方法を学...

Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決

Mysql マスタースレーブ同期の Last_IO_Errno:1236 エラーの原因は何ですか? ...