本日の発表は、カット、インターネット検索に写真をアップロードするために、ユーザーが必要な需要を上げ、の使用に関する記録を公式サイトのAPIを理解することは非常にできない、非常に良いcropperjs

私は、プロジェクトのモバイル終わりをVUEを使用しています。

公式ウェブサイトのアドレス:cropperjs

GitHubの住所:https://github.com/fengyuanchen/cropperjs/blob/master/README.md

レンダリング、または魅力のないああを見てください!

 

 

ここでのみ達成するために、いくつかのパラメータを変更する方法として、あなたは公式サイトのAPIの理解に行き、メソッドを使用して記録。

まず、聞かせてのは、EXIF-jsからcropperjsをインストールNPMインストール 

ストレージcropperjsはメソッドを処理し、画像ファイルを新規作成します(私は次のclipper.js静的ファイル内のファイルを置きます)

「cropperjs」からクロッパーをインポート
'EXIF-JS' からの輸入のExif
輸出のデフォルト{
  インストール(ヴュ){
    // Initializeメソッド
    Vue.prototype.initilize =関数(OPT){
      自己がこの=ましょう。
      this.options = OPT。
      // DOMを作成します。
      this.createElement();
      this.resultObj = opt.resultObj。
      //初期化切断オブジェクト
      this.cropper =新しいクロッパー(this.preview、{
        アスペクト比:opt.aspectRatio || 1、
        autoCropArea:opt.autoCropArea || 0.8、
        ビューモード:1、
        ガイド:opt.aspectRatio == '無料'?真偽 、
        cropBoxResizable:opt.aspectRatio == '無料'?真偽 、
        cropBoxMovable:opt.aspectRatio == '無料'?真偽 、
        dragCrop:opt.aspectRatio == '無料'?真偽 、
        背景:偽、
        checkOrientation:真、
        checkCrossOrigin:真、
        ズーム可能:偽、
        zoomOnWheel:偽、
        センター:偽、
        toggleDragModeOnDblclick:偽、
        レディ:関数(){
          //にconsole.log(self.cropper.rotate(90))
          もし(opt.aspectRatio == '自由'){
            クロップボックス= self.cropper.cropBoxをしましょう。
            cropBox.querySelector( 'span.cropperビューボックス')style.outline = 'なし'。
            self.cropper.disable();
          }
        }
      });
    }
    画像切り出しのために、必要なDOMを作成します//
    Vue.prototype.createElement =関数(){
      //空のオブジェクトのために絵を初期化
      this.preview = NULL;

      STR =「の<div> <IMGのid = "clip_image" SRC = "originUrl"> </ div> <ボタンタイプ= "ボタン" ID = "cancel_clip">取消</ button>の<ボタンタイプ= "ボタン" IDましょう= "clip_button">确定</ボタン> ';
      STR + =「<DIV CLASS = "crop_loading"> <DIV CLASS = "crop_content"> <IMG SRC = "../静的/ loading.gif "> <DIV CLASS =" crop_text">图片上传中</ DIV> < / DIV> </ div> ';
      STR + = '<DIV CLASS = "crop_success"> <DIV CLASS = "crop_success_text">上传成功</ div> </ div> </ div>';

      せ、本体= document.getElementsByTagName( 'ボディ')[0];
      this.reagion =のdocument.createElement( 'DIV');
      this.reagion.id = 'clip_container';
      this.reagion.className = 'コンテナ';
      this.reagion.innerHTML = STR。
      //作成されたDOM要素を追加
      body.appendChild(this.reagion)。
      this.preview =のdocument.getElementById( 'clip_image')。

      //バインド方法
      this.initFunction();
    }
    //バインドされ、いくつかの機能を初期化します
    Vue.prototype.initFunction =関数(){
      自己がこの=ましょう。
      this.clickBtn =のdocument.getElementById( 'clip_button')。
      this.cancelBtn =のdocument.getElementById( 'cancel_clip')。
      //イベントを決定
      this.addEvent(this.clickBtn、 'クリック'、機能(){
        self.crop();
      })
      //イベントをキャンセル
      this.addEvent(this.cancelBtn、 'クリック'、機能(){
        self.destoried();
      })
      //クリア入力値
      this.addEvent(this.fileObj、 'クリック'、機能(){
        this.value = '';
      })
    }

    オブジェクト変更の際に入力を呼び出すための//外部インターフェイス[「ファイル」]
    Vue.prototype.clip =関数(E、OPT){
      自己がこの=ましょう。

      this.fileObj = e.srcElement。

      ファイル= e.target.filesましょう|| e.dataTransfer.files;

      (!files.length)戻りfalseの場合; //画像を直接返しません

      //初期化メソッドが呼び出されます
      this.initilize(OPT)。

      //画像ファイルのリソースを取得します。
      this.picValue =ファイル[0];

      写真を撮るとき、//情報を取得するには、写真が問題を解決するために回転させて
      // Exif.getData(ファイル[0]、関数(){
      // self.Orientation = Exif.getTag(ファイル[0]、 '方向');
      //にconsole.log(self.Orientation)
      //})。


      // URL形式にメソッドターンを呼び出します
      this.originUrl = this.getObjectURL(this.picValue)。

      //新しいURLを取得する各画像を置き換えます
      IF(this.cropper){
        this.cropper.replace(this.originUrl)。
      }

    }
    //画像トランスコーディング方法
    Vue.prototype.getObjectURL =関数(ファイル){
      URL = nullをしましょう。
      (window.createObjectURL!=未定義){//基本的な場合
        URL = window.createObjectURL(ファイル);
      それ以外の場合}(window.URLは!=未定義){//モジラ(Firefoxの)
        URL = window.URL.createObjectURL(ファイル);
      }他(window.webkitURL!=未定義)の場合{// WebKitのか、クロム
        URL = window.webkitURL.createObjectURL(ファイル);
      }
      URLを返します。
    }
    //作物にOKをクリックします
    Vue.prototype.crop =関数(){
      自己がこの=ましょう。
      画像=新しいイメージを聞かせて();
      croppedCanvasをしましょう。
      roundedCanvasをしましょう。

      //クロップ
      document.querySelector( 'crop_loading。')style.display = 'ブロック'。

      setTimeout(関数(){
        croppedCanvas = self.cropper.getCroppedCanvas()。
        // 円形
        roundedCanvas = self.getRoundedCanvas(croppedCanvas)。

        )(imgData = roundedCanvas.toDataURLてみましょう。
        image.src = imgData。

        //画像は、100Kよりも大きい場合、直接アップロード、圧縮、およびその逆以下であるか否かを決定します
        IF(×1024 imgData.length <(100)){
          self.resultObj.src = imgData。
          //画像のアップロード
          self.postImg(imgData)。

        }他{
          image.onload =関数(){
            //圧縮処理
            データ= self.compress(画像、self.Orientation)とします。
            self.resultObj.srcは、データを=。
            //画像のアップロード
            self.postImg(データ)。
          }
        }
      }、20)
    }
    作物の画像リソースを取得します//
    Vue.prototype.getRoundedCanvas =関数(sourceCanvas){

      キャンバス=のdocument.createElement(「キャンバス」)しましょう。
      せコンテキスト= canvas.getContext( '2D');
      幅= sourceCanvas.widthてみましょう。
      高さ= sourceCanvas.heightてみましょう。

      canvas.width =幅;
      canvas.height =高さ;

      context.imageSmoothingEnabled =はtrue。
      context.drawImage(sourceCanvas、0、0、幅、高さ)。
      context.globalCompositeOperation =「宛先イン」;
      context.beginPath();
      context.rect(0、0、幅、高さ)。
      context.fill();

      キャンバスを返します。
    }
    //元のオブジェクトを破壊します
    Vue.prototype.destoried =関数(){
      自己がこの=ましょう。
      //削除イベント
      this.removeEvent(this.clickBtn、 'クリック' は、null);
      this.removeEvent(this.cancelBtn、 'クリック' は、null);
      this.removeEvent(this.fileObj、 'クリック' は、null);
      //クロップフレームを削除
      this.reagion.parentNode.removeChild(this.reagion)。

      //オブジェクトのトリミングを破壊します
      this.cropper.destroy();
      this.cropper = NULL;
    }
    //画像のアップロード
    Vue.prototype.postImg =関数(画像データ){
      //画像をアップロードするためにここに書きます
      自己がこの=ましょう。
      self.destoried();

      window.setTimeoutは(関数(){
        document.querySelector( 'crop_loading。')style.display = 'なし'。
        document.querySelector(」crop_success。)style.display = 'ブロック'。
        オブジェクトを破壊した後//カット
          self.destoried();
      }、3000)
    }

    //画像の回転
    Vue.prototype.rotateImg =関数(IMG、方向、キャンバス){
      //最小および最大の回転方向、原画像回転方向と第バック
      CONST min_step = 0。
      CONST max_step = 3。
      (IMG == null)の復帰であれば、
      // IMGの高さと幅は、img要素の隠蔽後に得ることができない、またはエラーが発生します
      高さ= img.heightてみましょう。
      幅= img.widthてみましょう。
      ステップ= 2ましょう。
      IF(ステップ== NULL){
        ステップ= min_step。
      }
      IF(方向== '右'){
        ステップ++;
        //元の位置に回転、すなわち、最大値を超え
        ステップ> max_step &&(ステップ= min_step)。
      }他{
        step--;
        ステップ<min_step &&(ステップ= max_step)。
      }
      ラジアンで//回転角度パラメータ値
      * 90 *にMath.PI / 180度=ステップを聞かせて、
      CTX = canvas.getContext( '2D')とします。
      スイッチ(ステップ){
        ケース0:
          canvas.width =幅;
          canvas.height =高さ;
          ctx.drawImage(IMG、0、0);
          ブレーク;
        ケース1:
          canvas.width =高さ;
          canvas.height =幅;
          ctx.rotate(度)。
          ctx.drawImage(IMG、0、-height)。
          ブレーク;
        ケース2:
          canvas.width =幅;
          canvas.height =高さ;
          ctx.rotate(度)。
          ctx.drawImage(IMG、-width、-height)。
          ブレーク;
        ケース3:
          canvas.width =高さ;
          canvas.height =幅;
          ctx.rotate(度)。
          ctx.drawImage(IMG、-width、0);
          ブレーク;
      }
    }

    //画像圧縮
    Vue.prototype.compress =関数(IMG、オリエンテーション){
      キャンバス=のdocument.createElement(「キャンバス」)しましょう。
      CTX = canvas.getContext( '2D')とします。
      //タイルキャンバス
      TCanvas =のdocument.createElement( "キャンバス")しましょう。
      ( "2D")のTCtx = tCanvas.getContextましょう。
      INITSIZE = img.src.lengthてみましょう。
      幅= img.widthてみましょう。
      高さ= img.heightてみましょう。

      画像は、4つのメガピクセルよりも大きい場合、// 400百万以下に圧縮比と圧力の大きさを計算します
      比率を聞かせて。
      IF((比=幅*高さ/ 4000000)> 1){
        console.log(「400万個の画素より大きい」)
        比= Math.sqrt(比)
        幅/ =比。
        高さ/ =比。
      }他{
        比= 1。
      }
      canvas.width =幅;
      canvas.height =高さ;
      //色の寝具
      ctx.fillStyleは "#FFFを" =;
      ctx.fillRect(0、0、canvas.width、canvas.height)。
      //画像がタイルのドローを使用して100万個のピクセルよりも大きい場合
      数えてみましょう。
      IF((カウント=幅*高さ/ 1000000)> 1){
        カウント= ~~(Math.sqrt(回数)+ 1); //計算どのように多くのブロックがタイルに分割されます
        //計算各タイルの幅と高さ
        NW = ~~(幅/数)しましょう。
        NH = ~~(高さ/数)しましょう。
        tCanvas.width = NW;
        tCanvas.height = NH;
        {(I ++;;私は<カウントI = 0ましょう)について
          以下のために(聞かせてJ = 0; jの<数; J ++){
            tctx.drawImage(IMG、I * NW *比、J *、NH *比、NW *比、NH *比、0、0、NW、NH)。
            ctx.drawImage(するTCanvas、I * NW、J * NH、NW、NH);
          }
        }
      }他{
        ctx.drawImage(IMG、0、0、幅、高さ)。
      }
      写真をアップロードする//修理IOS時間が回転している問題
      (オリエンテーション!= "" &&オリエンテーション!= 1)の場合{
        スイッチ(配向){
          ケース6://必要時計回り(左)90度回転
            this.rotateImg(IMGは、キャンバス、 '左')。
            ブレーク;
          ケース8://必要性を反時計回り(右)90度回転
            this.rotateImg(IMG、 '右'、キャンバス);
            ブレーク;
          ケース3:// 180度の回転が必要
            this.rotateImg(IMG、 '正しい'、キャンバスは); //二回回し
            this.rotateImg(IMG、 '右'、キャンバス);
            ブレーク;
        }
      }
      //最小限の圧縮
      Iはcanvas.toDataURL( "画像/ JPEG"、0.1)=ましょう。
      console.log( '圧縮前:' + INITSIZE)。
      console.log( '圧縮:' + ndata.length)。
      console.log(「压缩率: "~~ +(100 *(nitSize I  -  ndata.length)/ I nitSize)+" %「);
      tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0。

      NDATAリターン;
    }

    //イベントを追加
    Vue.prototype.addEvent =関数(OBJ、タイプ、FN){
      IF(obj.addEventListener){
        obj.addEventListener(タイプ、FN、偽);
      }他{
        (+型、FN 'に')obj.attachEvent。
      }
    }
    //削除イベント
    Vue.prototype.removeEvent =関数(OBJ、タイプ、FN){
      IF(obj.removeEventListener){
        obj.removeEventListener(タイプ、FN、偽);
      }他{
        (+型、FN 'に')obj.detachEvent。
      }
    }
  }
}

 

メイン文書導入クリッパーで、コールVUE、使用(クリッパー)メソッド

`import`コマンドでロードする// Vueのビルドバージョン
//(実行時のみ、またはスタンドアロン)の別名を持つwebpack.base.confに設定されています。
「表示」からインポートビュー
「./App」からの輸入のApp
「./router」からインポートルータ
「../static/clipper」からインポートクリッパー

Vue.config.productionTip =偽

Vue.use(クリッパー)

/ * eslintディセーブル無新しいです* /
新しいビュー({
  「#app」
  ルータ、
  テンプレート: ' < アプリケーション/> '、
  成分:{アプリケーション}
})

 

メソッドは、呼び出しコンポーネントをclipper.js

<テンプレート>
    <DIV CLASS = "こんにちは">
        <IMG SRC = "./資産/ upload.png" ALT = "" ID = "IMG">
        <input type = "ファイル" 受け入れる= "画像/ JPEG、画像/ PNG形式、画像/ JPEG" = "変更($イベント)" の変化@>
    </ div>
</テンプレート>

<スクリプト>
輸出のデフォルト{
  データ(){
    リターン{

    }
  }、 
  方法:{
    変更(イベント){
      画像=のdocument.getElementById( 'IMG')とします。
      this.clip(イベント、{
        でresultObj:画像、
        アスペクト比:1、
      })
    }
  }
}
</ SCRIPT>

 

おめでとうは成功し、一度コードを運びます!

 

クリッパー

おすすめ

転載: www.cnblogs.com/liangziaha/p/11962061.html
おすすめ