Vue中使用Cropper.js裁剪圖片

来源:https://www.cnblogs.com/linxiyue/archive/2019/01/18/10288490.html
-Advertisement-
Play Games

Cropper.js是一款很好用的圖片裁剪工具,可以對圖片的尺寸、寬高比進行裁剪,滿足諸如裁剪頭像上傳、商品圖片編輯之類的需求。 github: https://github.com/fengyuanchen/cropperjs 網站: https://fengyuanchen.github.io/ ...


Cropper.js是一款很好用的圖片裁剪工具,可以對圖片的尺寸、寬高比進行裁剪,滿足諸如裁剪頭像上傳、商品圖片編輯之類的需求。

github: https://github.com/fengyuanchen/cropperjs

網站: https://fengyuanchen.github.io/cropperjs/

簡單使用

使用很簡單,首先需要一個image或者canvas元素:

<!-- Wrap the image or canvas element with a block element (container) -->
<div>
  <img id="image" src="picture.jpg">
</div>

  

/* Limit image width to avoid overflow the container */
img {
  max-width: 100%; /* This rule is very important, please do not ignore this! */
}

 然後使用此元素創建Cropper:

// import 'cropperjs/dist/cropper.css';
import Cropper from 'cropperjs';

const image = document.getElementById('image');
const cropper = new Cropper(image, {
  aspectRatio: 16 / 9,
  crop(event) {
    console.log(event.detail.x);
    console.log(event.detail.y);
    console.log(event.detail.width);
    console.log(event.detail.height);
    console.log(event.detail.rotate);
    console.log(event.detail.scaleX);
    console.log(event.detail.scaleY);
  },
});

 vue代碼:

<template>
  <div>
    <div style="width: 750px; height: 500px; margin: 20px; border: dashed #cacaca 1px; text-align: center;">
      <img :src="cropperImg" style="max-width: 100%" ref="img">
    </div>
  </div>
</template>

<script>
import Cropper from 'cropperjs'
// import 'cropperjs/dist/cropper.min.css'

export default {
  name: "ImgCropper",
  data () {
    return {
      cropperImg: '',
      cropper: '',
      imgName: ''
    }
  },
  mounted () {
    this.initCropper()
  },
  methods: {
    initCropper () {
      let cropper = new Cropper(this.$refs.img, {
        viewMode: 1,
        aspectRatio: 16/9,
      })
      this.cropper = cropper
    },
  }
}
</script>

 因為img元素的src屬性為空,裁剪區域顯示空白。一般的需求是上傳圖片裁剪,添加上傳圖片功能:

<input type="file" @change="uploadImg" />

  

uploadImg (event) {
  const img = event.target.files[0]
  this.cropperImg = URL.createObjectURL(img)
},

 點擊上傳圖片後就可以裁剪了:

 將裁剪的圖片保存或者上傳:

    uploadCropImg () {
      const _this = this
      this.cropper.getCroppedCanvas().toBlob(async function(blob) {
        const params = new FormData()
        params.append('upload_file', blob, _this.imgName)
        $.ajax(...)
      }, 'image/jpeg')
    },

 canvas轉換為Blob時註意第二個參數預設是image/png的,介面上傳有大小限制的情況下,可以設置為image/jpeg。

   保存圖片:

    saveCropImg () {
      const _this = this
      this.cropper.getCroppedCanvas().toBlob(function(blob) {
        const href = window.URL.createObjectURL(blob);
      const downloadElement = document.createElement('a');
      downloadElement.href = href;
      downloadElement.download = _this.imgName
      document.body.appendChild(downloadElement);
      downloadElement.click(); 
      document.body.removeChild(downloadElement);
      window.URL.revokeObjectURL(href);
      }, 'image/jpeg')
    },

 這樣簡單的上傳、裁剪、保存功能就實現了。

Options

Cropper還有很多有用的選項,比較重要的:

viewMode

Number,預設值0,可選值0,1,2,3

Cropper容器基本有4個部分,官網示例:

mode為0的情況下,crop box部分可以超出canvans的範圍,mode為1,2,3時crop box被限制在canvas範圍之內,mode為2,3時會將canvas限制在container之內。

image與crop box都是可以移動的,雙擊可以切換move mode與crop mode。

aspectRatio

Number,croper box的寬高比,可以為裁剪設置固定的寬高比,值為NaN時,可自由裁剪。可以使用Shift鍵來切換或者固定寬高比。

data

Object,可以用來預設crop box,初始化的時候提供給SetData()使用。

checkCrossOrigin

Boolean,預設值true。檢查圖片是否跨域,圖片跨域時會為圖片添加crossOrigin屬性,併為圖片地址添加一個隨機時間戳避免緩存。

<img crossorigin="anonymous" src="https://fengyuanchen.github.io/cropperjs/images/picture.jpg?timestamp=1547879277777" class="cropper-hide" style="width: 752px; height: 423px; transform: none;">

Methods

crop()

顯示crop box

new Cropper(image, {
  autoCrop: false,
  ready() {
    // Do something here
    // ...

    // And then
    this.cropper.crop();
  },
});

reset()

將crop box置於初始的狀態,寬高比,大小等。

clear()

清除crop box

destroy()

destroy Cropper實例。

replace(url[, hasSameSize])

替換img的url地址。

move(offsetX[, offsetY]),moveTo(x[, y])

移動canvas

zoom(ratio),zoomTo(ratio[, pivot])

放大或者縮小canvas

rotate(degree),rotateTo(degree)

旋轉image

scale(scaleX[, scaleY]),scaleX(scaleX),scaleY(scaleY)

改變image的寬高比,拉伸等。

getData([rounded]),setData(data)

獲取,設置croper box的實際位置,大小數據

getContainerData()

獲取container的大小數據

getImageData()

獲取image的位置,大小等相關信息。

getCanvasData(),setCanvasData(data)

獲取canvas的位置,大小信息。

getCropBoxData(),setCropBoxData(data)

獲取crop box的位置,大小信息等,與getData()的區別是,getData()是獲取的實際大小,getCropBoxData()獲取的是顯示大小,因為image一般是縮小顯示的。

getCroppedCanvas([options])

比較重要的方法,獲取一個HTMLCanvasElement元素,繪製了整個crop box。

可以在options中設置寬高,也可以取預設值:

cropper.getCroppedCanvas({
  width: 160,
  height: 90,
  minWidth: 256,
  minHeight: 256,
  maxWidth: 4096,
  maxHeight: 4096,
  fillColor: '#fff',
  imageSmoothingEnabled: false,
  imageSmoothingQuality: 'high',
});

 轉為Blob:

// Upload cropped image to server if the browser supports `HTMLCanvasElement.toBlob`
cropper.getCroppedCanvas().toBlob((blob) => {
  const formData = new FormData();

  formData.append('croppedImage', blob);

  // Use `jQuery.ajax` method
  $.ajax('/path/to/upload', {
    method: "POST",
    data: formData,
    processData: false,
    contentType: false,
    success() {
      console.log('Upload success');
    },
    error() {
      console.log('Upload error');
    },
  });
});

 轉為base64 url:

cropper.getCroppedCanvas().toDataURL('image/png')

 如果手機上不支持toBlob(),有個polyfill JavaScript-Canvas-to-Blob 。

setAspectRatio(aspectRatio)

設置crop box的寬高比。

Events

Cropper實例是掛在img上的,可以為目標img添加事件

ready

img已載入好,Cropper實例可以被操作了:

let cropper;

image.addEventListener('ready', function () {
  console.log(this.cropper === cropper);
  // > true
});

cropper = new Cropper(image);

cropstart

開始裁剪

cropmove

裁剪時事件

cropend

裁剪結束事件

crop

crop box發生變化時的事件。

這些事件都可以放在Cropper的options之中。

比如,限定裁剪時的寬高比:

    initCropper () {
      let cropper = new Cropper(this.$refs.img, {
        viewMode: 1,
        cropmove () {
          const cropper = this.cropper;
          const minAspectRatio = 0.5
          const maxAspectRatio = 1.5
          const cropBoxData = cropper.getCropBoxData();
          const aspectRatio = cropBoxData.width / cropBoxData.height;
          if (aspectRatio < minAspectRatio) {
            cropper.setCropBoxData({
              width: cropBoxData.height * minAspectRatio
            });
          } else if (aspectRatio > maxAspectRatio) {
            cropper.setCropBoxData({
              width: cropBoxData.height * maxAspectRatio
            });
          }
        }
      })
      this.cropper = cropper
    },

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概述 FormData類型是XMLHttpRequest 2級定義的,它是為序列化表以及創建與表單格式相同的數據提供便利。 作用:1.利用一些鍵值對來模擬一系列表單控制項:即將form中的所有表單元素的name和value組裝成一個queryString;2.非同步上傳二進位文件。 與普通Ajax相 ...
  • [toc] 首發日期:2019 01 19 前言: 有時候,一個後端開發者“不得不”自己去搭建前端界面。如果有的選,當然選一個比較好學的前端“框架”咯(框架很多時候封裝了普通的html元素,使得能更加方便地使用)。 如果你做的項目的界面是一個偏後臺管理的而且要求並不高的界面的時候,你可以考慮easy ...
  • 元素事件:滑鼠按下事件/滑鼠移動事件/滑鼠鬆開事件 元素樣式:讓元素脫離文檔流,採用絕對定位的方式。 一、滑鼠按下事件 當滑鼠在元素上面按下時,保存元素的初始偏移量和滑鼠按下時的坐標,然後在狀態變數裡面標記當前狀態為按下狀態。 二、滑鼠移動事件 當滑鼠拖動元素移動時,我們通過計算滑鼠從起始位到移動位 ...
  • 不知不覺我的第一個小程式已經上線一周了,uv也穩定的上升著。 很多人說我的小程式沒啥用,我默默一笑,心裡說:“它一直敦促我學習,敦促我進步”。我的以一個小程式初衷是經驗分享,目前先把經驗分享到博客園,邊學習邊完善小程式。同時我會持續學習,持續更新,功能定會一天天的完善起來。 歡迎大家掃碼體驗。 閑話 ...
  • 在結構上多一個指向自身的constructor構造函數,這就是原型鏈夠簡單吧. 利用原型鏈結構實現繼承和向鏈表中插入節點,有區別嗎? 沒區別!! ...
  • 先上效果 開發環境要求 需要事先安裝node及npm 前期準備 1.創建文件夾react-echarts-editor2.在項目根目錄(以下稱根目錄)下創建src目錄3.在項目根目錄下創建dist目錄4.在src目錄下創建app.js文件(該文件就來一個react-echarts版的hello wo ...
  • 前言 此內容是個人學習筆記,以便日後翻閱。 非教程,如有錯誤還請指出 Webpack 打包文件 支持JS模塊化 模式: production(0配置預設), development(生產環境) 更詳細的請前往 webpack官網 安裝 npm i webpack webpack cli D 執行 w ...
  • 寫這篇文章之前,關於ubuntu14.04(Trusty)預設安裝的NodeJS版本是0.10.25百思不解(什麼鬼,哪一年的NodeJS) 寫這篇文章之時,NodeJS的LTS版本號都已經10.15.0,當然Ubuntu在2018年也都發行ubuntu18.04(我還沒打算用) 系統我可以用4... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...