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

推薦する

MySQLパーティションテーブルの詳細な説明

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...

クリーンで美しいウェブデザインのための4つの原則

この記事では、 Webデザインに関連するこれら4 つの原則について説明します。これら4 つの原則を念...

Vueは視覚的なドラッグページエディタを実装します

目次ドラッグアンドドロップの実装ドラッグイベントドラッグして開始リリースゾーンでの移動境界処理、角度...

Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。

かなり前に実装された機能ですが、クリックすると選択したメニュー項目の背景色が白くなることに気付きまし...

HTML での非同期ファイルアップロードの例

コードをコピーコードは次のとおりです。 <form action="/hehe&qu...

WeChatアプレットwebViewにH5を埋め込む方法の例

序文WeChat ミニプログラムは新しいオープン機能を提供します!ついにミニプログラムにHTMLペー...

MySQLのロングトランザクションに関する深い理解

序文:この記事では主にMySQLのロングトランザクションに関する内容を紹介します。例えば、トランザク...

数千万データを持つMySQLテーブルを最適化する実践記録

序文まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異...

Vue Element UIの使用時に遭遇した問題をまとめる

目次1. DateTimePickerの日付選択範囲は現在時刻とそれ以前です2. DateTimeP...

優れた登録プロセスの手順

ウェブサイトにとって、これは最も基本的な機能です。それでは、登録プロセスに含まれる手順を見てみましょ...

HTML テーブルタグチュートリアル (45): テーブル本体タグ

<tbody> タグは、テーブル本体のスタイルを定義するために使用されます。基本構文 &...

MySQL外部キーの3つの関係例の詳細な説明

この記事では、例を使用して、MySQL 外部キーの 3 つの関係について説明します。ご参考までに、詳...

Linux の traceroute コマンドの使用方法の詳細な説明

Traceroute を使用すると、情報がコンピュータからインターネットの反対側のホストまでたどるパ...

Linux システムで PATH 環境変数を設定する方法 (3 つの方法)

1. Windows システムでは、JDK のインストールなど、多くのソフトウェアのインストールで...

HTML ページに SVG を挿入する複数の方法

SVG (Scalable Vector Graphics)は、XML 構文に基づいた画像形式です。...