vue-cropper を使用して vue で写真をトリミングする方法をご存知ですか?

vue-cropper を使用して vue で写真をトリミングする方法をご存知ですか?

公式サイト:

https://github.com/xyxiao001/vue-cropper

1. インストール:

npm インストール vue-cropper 

または

糸を追加 vue-cropper

2. 使用方法:

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

componentを設定します:

エクスポートデフォルト{
  コンポーネント:
    ビュークロッパー
  }
}

templateに挿入: (プラグインの表示サイズを設定するには、外側に div が必要です)

<vueクロッパー
      ref="クロッパー"
      :img="オプション.img"
      :outputSize="オプションのサイズ"
      :outputType="オプション.outputType"
</vueクロッパー>
    データ(){
      戻る {
         オプション:{
            img: 'imgUrl', // 画像の URL または base64
            サイズ: 1,
            出力タイプ: 'png',
         }
      }
    }

3. 組み込みメソッド:

名前関数デフォルト値オプション値
画像切り取られた画像のアドレスヌルURL アドレス / base64 / blob
出力サイズ切り抜いた画像の品質1 0.1 - 1
出力タイプ切り取られた画像のアドレスjpg (jpg は jpeg で渡す必要があります) jpeg / png / ウェブ

組み込みメソッド: this.$refs.cropper経由でプラグインを呼び出します。

this.$refs.cropper.startCrop()スクリーンショットの撮影を開始します (スクリーンショット フレームが設定されていない場合は、これを介してスクリーンショット フレームを開始します)

this.$refs.cropper.stopCrop()スクリーンショットの撮影を停止します

this.$refs.cropper.clearCrop()スクリーンショットをクリア

this.$refs.cropper.getCropData()スクリーンショット情報を取得します(スクリーンショットの URL または base64 を取得します)

    // スクリーンショットのbase64データを取得します。this.$refs.cropper.getCropData((data) => {
      // 何かをする
      コンソール.log(データ)
    })
    // スクリーンショットのBLOBデータを取得します。this.$refs.cropper.getCropBlob((data) => {
      // 何かをする
      コンソール.log(データ)
    })

4. 使用方法:

<テンプレート>
  <div>
    <el-dialog title="画像の切り抜き" :visible.sync="表示" append-to-body width="950px" center>
      <div class="cropper-content">
        <div class="cropper-box">
          <div class="cropper">
            <vue-cropper ref = "cropper":img = "option.img":outputsize = "option.outputtype =" option.outputtype ":" option.info ":canscale":canscale ":autocrop =" option.autocrop " 8 ":sixed =" option.fixed ":sixednumber =" option.fixednumber ":full =" option.full ":sixedbox =" option.fixedbox ":canmove =" option.canmove ":canmovebox =" option.canmovebox ":original =" option.original ":centerbox =" opt optionbox ":" height = " ize = "option.maximgsize":拡大= "option.enlarge":mode = "option.mode" @realtime = "realtime" @imgload = "imgload">
            </vue-cropper>
          </div>
          <!--下部操作ツールボタン-->
          <div class="footer-btn">
            <div class="scope-btn">
              <label class="btn" for="uploads">画像を選択</label>
              <input type="file" id="uploads" style="position:absolute; clip:rect(0 0 0 0);" accept="image/png, image/jpeg, image/gif, image/jpg" @change="selectImg($event)">
              <el-button size="mini" type="danger" plain icon="el-icon-zoom-in" @click="changeScale(1)">ズームイン</el-button>
              <el-button size="mini" type="danger" plain icon="el-icon-zoom-out" @click="changeScale(-1)">ズームアウト</el-button>
              <el-button size="mini" type="danger" plain @click="rotateLeft">↺ 左に回転</el-button>
              <el-button size="mini" type="danger" plain @click="rotateRight">↻ 右に回転</el-button>
            </div>
            <div class="アップロード-btn">
              <el-button size="mini" type="success" @click="uploadImg('blob')">画像をアップロード<i class="el-icon-upload"></i></el-button>
            </div>
          </div>
        </div>
        <!--効果画像のプレビュー-->
        <div class="show-preview">
          <div :style="previews.div" class="preview">
            <img :src="previews.url" :style="previews.img">
          </div>
        </div>
      </div>
    </el-ダイアログ>
  </div>
</テンプレート>
<スクリプト>
'vue-cropper' から { VueCropper } をインポートします
エクスポートデフォルト{
  名前: "CropperImage",
  コンポーネント:
    ビュークロッパー
  },
  データ () {
    戻る {
      表示: this.visible、
      名前: this.Name、
      プレビュー: {},
      オプション: {
        img: '', // 切り抜かれた画像のアドレス outputSize: 1, // 切り抜かれた画像の品質 (オプション 0.1 - 1)
        outputType: 'jpeg', //切り取って画像形式を生成します (jpeg || png || webp)
        : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
    };
  },
  小道具: {
    見える:
      タイプ: ブール値、
      デフォルト: false
    },
    名前:
      タイプ: 文字列、
      デフォルト: ''
    }
  },
  時計:
    見える () {
      this.show = this.visible
    }
  },
  メソッド: {
    // 初期化関数 imgLoad (msg) {
    },
    //画像の拡大縮小 changeScale (num) {
      数値 = 数値 || 1
      this.$refs.cropper.changeScale(数値)
    },
    //左に回転 rotateLeft () {
      this.$refs.cropper.rotateLeft()
    },
    //右に回転 rotateRight () {
      this.$refs.cropper.rotateRight()
    },
    //リアルタイムプレビュー関数 realTime (data) {
      this.previews = データ
    },
    //画像を選択する selectImg (e) {
      ファイルをe.target.files[0]とします
      if (!/\.(jpg|jpeg|png|JPG|PNG)$/.test(e.target.value)) {
        this.$メッセージ({
          メッセージ: '画像タイプの要件: jpeg、jpg、png'、
          タイプ: 「エラー」
        });
        偽を返す
      }
      //BLOBに変換する
      リーダーを新しいFileReader()にします
      リーダー.onload = (e) => {
        データ
        if (typeof e.target.result === 'object') {
          データ = window.URL.createObjectURL(新しいBlob([e.target.result]))
        } それ以外 {
          データ = e.target.result
        }
        this.option.img = データ
      }
      //base64に変換
      reader.readAsDataURL(ファイル)
    },
    //画像をアップロード uploadImg (type) {
      _this = this とします
      if (type === 'blob') {
        // スクリーンショットのBLOBデータを取得します this.$refs.cropper.getCropBlob(async (data) => {
          formData を新しい FormData() にします。
          formData.append('file', data, new Date().getTime() + '.png')
          // アップロードするには axios を呼び出します let { data: res } = await _this.$http.post(`${msBaseUrl}common-tools-web/file/upload/image`, formData)
          (res.code === 200)の場合{
            _this.$メッセージ({
              メッセージ: res.desc、
              タイプ: 「成功」
            });
            データ = res.result とします
            imgInfo = {
              名前: データ名、
              id: データ.id、
              URL: データ.url
            };
            _this.$emit('uploadImgSuccess', imgInfo);
          } それ以外 {
            _this.$メッセージ({
              メッセージ: 'ファイル サービス異常です。管理者に連絡してください! '、
              タイプ: 「エラー」
            })
          }
        })
      }
    }
  }
}
</スクリプト>
<style スコープ lang="less">
.クロッパーコンテンツ{
  ディスプレイ: フレックス;
  ディスプレイ: -webkit-flex;
  コンテンツの端揃え: flex-end;
  .クロッパーボックス{
    フレックス: 1;
    幅: 100%;
    .クロッパー{
      幅: 自動;
      高さ: 300px;
    }
  }
  .表示プレビュー{
    フレックス: 1;
    -webkit-flex: 1;
    ディスプレイ: フレックス;
    ディスプレイ: -webkit-flex;
    コンテンツの中央揃え: 中央;
    .プレビュー{
      オーバーフロー: 非表示;
      境界線: 1px実線 #67c23a;
      背景: #cccccc;
    }
  }
}
.footer-btn {
  上マージン: 30px;
  ディスプレイ: フレックス;
  ディスプレイ: -webkit-flex;
  コンテンツの端揃え: flex-end;
  .スコープボタン{
    ディスプレイ: フレックス;
    ディスプレイ: -webkit-flex;
    コンテンツの両端揃え: スペースの間;
    右パディング: 10px;
  }
  .アップロードボタン{
    フレックス: 1;
    -webkit-flex: 1;
    ディスプレイ: フレックス;
    ディスプレイ: -webkit-flex;
    コンテンツの中央揃え: 中央;
  }
  .btn{
    アウトライン: なし;
    表示: インラインブロック;
    行の高さ: 1;
    空白: ラップなし;
    カーソル: ポインタ;
    -webkit-appearance: なし;
    テキスト配置: 中央;
    -webkit-box-sizing: 境界線ボックス;
    ボックスのサイズ: 境界線ボックス;
    アウトライン: 0;
    -webkit-transition: 0.1秒;
    遷移: 0.1秒;
    フォントの太さ: 500;
    パディング: 8px 15px;
    フォントサイズ: 12px;
    境界線の半径: 3px;
    色: #fff;
    背景色: #409eff;
    境界線の色: #409eff;
    右マージン: 10px;
  }
}
</スタイル>

効果:

ここに画像の説明を挿入

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現
  • vue-cropper コンポーネントは画像の切り取りとアップロードを実現します
  • vue-cropperプラグインは、画像キャプチャとアップロードコンポーネントのカプセル化を実現します。
  • Vue画像切り抜きプラグインvue-cropperの使い方を詳しく説明します
  • Vue-cropper 画像切り抜きの基本原理とアイデア
  • Vue を cropper.js ベースでカプセル化し、オンライン画像切り抜きコンポーネント機能を実現する

<<:  フレックスレイアウトでコンテナ内のコンテンツを維持するためのソリューションの詳細な説明

>>:  フォーム送信ページの更新がジャンプしない

推薦する

Linux カーネル デバイス ドライバー Linux カーネル 基本メモの概要

1. Linuxカーネルドライバモジュールの仕組み静的ロードでは、ドライバモジュールをカーネルにコン...

CentOS 7 で MySQL 8 の複数のインスタンスを設定する詳細なチュートリアル (必要な数だけ設定できます)

原因最近、プロジェクトのリファクタリングを始めたのですが、マスタースレーブと読み取り書き込み分離を使...

MySQL 8.0.18はデータベースにユーザーを追加し、権限を付与します

1. データベースにログインするには、rootユーザーを使用することをお勧めします。 mysql -...

Vue 仮想リストの実例

目次序文デザイン成し遂げるまとめ序文最近は、いつも延々とスワイプしています。 Weibo をチェック...

PostgreSQL マテリアライズドビュープロセス分析

この記事は主にPostgreSQLマテリアライズドビューのプロセス分析について紹介します。サンプルコ...

HTML 固定タイトル列、タイトル ヘッダー テーブル固有の実装コード

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Docker Gitlab+Jenkins+Harborは永続的なプラットフォーム運用を構築します

CI/CD の概要CIワークフロー設計Gitコードバージョン管理システムはコマンドラインでのみ管理で...

Reactのコンポーネント共同利用実装

目次ネスティング親子コンポーネント通信ブラザーコンポーネント通信撤回するReact の Linked...

CSS フロントエンドの知識ポイントのまとめ(必読)

1. CSS の概念: (カスケーディング スタイル シート)利点: 1. コンテンツとプレゼンテ...

React.cloneElement の使い方の詳しい説明

目次cloneElementの役割使用シナリオ新しい小道具を追加するプロップを変更するイベントカスタ...

MySQLクライアント認証後の接続失敗の問題に対する完璧なソリューション

MySQL 環境をローカル (192.168.1.152) にデプロイし、リモート クライアント 1...

React forwardRefの使い方と注意点

これまで react.forwardRef は react の高階コンポーネントには適用できませんで...

MySQL データベースの詳細な説明 - 複数テーブル クエリ - 内部結合、外部結合、サブクエリ、相関サブクエリ

複数テーブルクエリ複数のテーブルから関連するクエリ結果を取得するには、単一の SELECT ステート...

Apache ストレステストツールのインストールと使用

1. ダウンロードApacheの公式サイトhttp://httpd.apache.org/にアクセス...

MySQLデータベースでサポートされているストレージエンジンの比較

目次ストレージエンジンMySQL でサポートされているストレージ エンジン同時実行制御ロック粒子をロ...