目錄
一、安裝
二、圖片裁切
三、將截圖框回顯到原圖上
首頁 web前端 Vue.js vue專案中藉助vue-cropper做圖片裁剪

vue專案中藉助vue-cropper做圖片裁剪

Oct 31, 2022 pm 07:16 PM
vue vue.js vue3

vue專案中怎麼做圖片裁切?以下這篇文章跟大家介紹怎麼使用vue-cropper做圖片裁剪,希望給大家有幫助!

vue專案中藉助vue-cropper做圖片裁剪

因為專案需要,需要做圖片裁剪。先前的專案已經由cropper.js實作過,因為這次使用的是vue,所以採用了vue-cropper這個元件,使用起來很簡單,但坑也很多。 (學習影片分享:vue影片教學

一、安裝

#
npm install vue-cropper
登入後複製

##main.js

import VueCropper from 'vue-cropper'
Vue.use(VueCropper)
登入後複製

二、圖片裁切

vue專案中藉助vue-cropper做圖片裁剪

1、引入VueCropper元件,並設定相關的屬性。

<div    style="max-width:90%">
            <vueCropper
              @mouseenter.native="enter"
              @mouseleave.native="leave"
              ref="cropper"
              :img="uploadImg"
              :outputSize="option.size"
              :outputType="option.outputType"
              :info="true"
              :full="option.full"
              :canMove="option.canMove"
              :canMoveBox="option.canMoveBox"
              :original="option.original"
              :autoCrop="option.autoCrop"
              :fixed="option.fixed"
              :fixedNumber="option.fixedNumber"
              :centerBox="option.centerBox"
              :infoTrue="option.infoTrue"
              :fixedBox="option.fixedBox"
              style="background-image:none"
            ></vueCropper>
</div>
登入後複製
option: {
       info: true, // 裁剪框的大小信息
       outputSize: 0.8, // 裁剪生成图片的质量
       outputType: "jpeg", // 裁剪生成图片的格式
       canScale: false, // 图片是否允许滚轮缩放
       autoCrop: false, // 是否默认生成截图框
       fixedBox: false, // 固定截图框大小 不允许改变
       fixed: false, // 是否开启截图框宽高固定比例
       fixedNumber: [7, 5], // 截图框的宽高比例
       full: true, // 是否输出原图比例的截图
       canMove: false, //时候可以移动原图
       canMoveBox: true, // 截图框能否拖动
       original: false, // 上传图片按照原始比例渲染
       centerBox: false, // 截图框是否被限制在图片里面
       infoTrue: true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
     }
登入後複製

❗️預設的裁剪圖片的背景帶有賊醜的馬賽克,其實是它用了一張馬賽克的圖片做背景,去掉只需在VueCropper上設置去除背景圖片的樣式

style ="background-image:none".

2、上傳完成後滑鼠進入VueCropper即可以開始裁切

在VueCroper上設定

@mouseenter.native="enter "事件(⭐️元件上使用原生事件需要加上native關鍵字)

enter() {
 if (this.uploadImg == "") {
   return;
 }
 this.$refs.cropper.startCrop(); //开始裁剪
},
登入後複製

3、離開VueCropper即停止裁剪,得到裁剪圖片。

在VueCroper上設定

@mouseleave.native="leave"事件

leave() {
   this.$refs.cropper.stopCrop();//停止裁剪
   this.$refs.cropper.getCropData(data => { //获取截图的base64格式数据
     this.cutImg = data;
   });
   // this.$refs.cropper.getCropBlob(data => { //获取截图的Blob格式数据
   //   this.cutImg = data;
   // });
 },
登入後複製

我這裡是離開p就會裁剪,點擊裁剪按鈕後傳遞裁剪圖片,而不是點擊裁剪按鈕才裁剪,因為我點擊裁剪按鈕裁剪的話,拿到的圖片並沒有裁剪過,我也不知道為什麼,就想出了這個辦法。

vue-cropper圖片裁切問題

三、將截圖框回顯到原圖上

vue專案中藉助vue-cropper做圖片裁剪
基本原理:

this.$refs.cropper.getCropAxis() //获取截图框基于容器的坐标点 {x1: 174, x2: 131, y1: 86, y2: 58}
this.$refs.cropper.cropW  //截图框宽
this.$refs.cropper.cropH //截图框高
登入後複製

透過上面的方式取得截圖框的寬、高和基於容器的座標點,然後讓VueCropper的自動截取框顯示出來並設定自動截取框的大小和位置。

以姓名欄位為例:

{
          id: 1,
          name: "姓名",
          cropInfo: {
            width: 108, //this.$refs.cropper.cropW
            height: 56, //this.$refs.cropper.cropH 
            offsetX: 174, //this.$refs.cropper.getCropAxis().x1
            offsetY: 86  //this.$refs.cropper.getCropAxis().y1
}
登入後複製

1、在"姓名"el-card上設定enter事件

enterCard(refWord) {
      this.$refs.cropper.goAutoCrop();//重新生成自动裁剪框
      this.$nextTick(() => {
        // if cropped and has position message, update crop box
        //设置自动裁剪框的宽高和位置
        this.$refs.cropper.cropOffsertX = refWord.cropInfo.offsetX;
        this.$refs.cropper.cropOffsertY = refWord.cropInfo.offsetY;
        this.$refs.cropper.cropW = refWord.cropInfo.width;
        this.$refs.cropper.cropH = refWord.cropInfo.height;
      });
    }
登入後複製

2、在所有el-card外層的el-tabs上設定leave事件


leaveCard() {
      this.$refs.cropper.clearCrop(); //取消裁剪框
    }
登入後複製
❗️注意不要在el-card上設定leave事件,不然進行滑鼠移動到下一個el-card的時候會取消裁剪框又重新生成,導致頁面出現閃爍的現象。

四、其它

  • 將截圖框限制在圖片內:https://github.com/xyxiao001/vue-cropper/issues /429

    解決方案:centerBox設定為true,並且只有autoCrop=true時才會生效

  • 專案需要將裁剪框框出的位置資訊和裁剪框大小給後台,讓後台裁剪或進行OCR,但傳給後台後裁剪出來的圖片總是向右下角偏移:https://github.com/xyxiao001/vue-cropper/issues/386

    解決方案:圖片是縮放過的,傳遞position時,需要將position*scale.

  • 裁剪大部分圖片沒有問題,但是裁剪某些圖片時總是有偏差:https://github.com /xyxiao001/vue-cropper/issues/439

    解決方法: 原來預設的裁切圖片大小有限制,寬高最高為2000px,將這個值設定為了10000,問題解決.

vue專案中藉助vue-cropper做圖片裁剪

【相關影片教學推薦:

vuejs入門教學web前端入門

以上是vue專案中藉助vue-cropper做圖片裁剪的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

vue遍歷怎麼用 vue遍歷怎麼用 Apr 07, 2025 pm 11:48 PM

Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。

vue的div怎麼跳轉 vue的div怎麼跳轉 Apr 08, 2025 am 09:18 AM

Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。

vue怎麼a標籤跳轉 vue怎麼a標籤跳轉 Apr 08, 2025 am 09:24 AM

實現 Vue 中 a 標籤跳轉的方法包括:HTML 模板中使用 a 標籤指定 href 屬性。使用 Vue 路由的 router-link 組件。使用 JavaScript 的 this.$router.push() 方法。可通過 query 參數傳遞參數,並在 router 選項中配置路由以進行動態跳轉。

React與Vue:Netflix使用哪個框架? React與Vue:Netflix使用哪個框架? Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVuedIrectly.1)TeamSperience:selectBasedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects:reactforforforproproject,reactforforforcompleplexones.3)cocatizationneedneeds:reactoffipicatizationneedneedneedneedneedneeds:reactoffersizationneedneedneedneedneeds:reactoffersizatization needefersmoreflexibleise.4)

vue組件傳值是什麼意思 vue組件傳值是什麼意思 Apr 07, 2025 pm 11:51 PM

Vue 組件傳值是一種在組件之間傳遞數據和信息的機制。它可以通過屬性 (props) 或事件 (events) 實現:屬性 (props):聲明要在組件中接收的數據,在父組件中傳遞數據。事件 (events):使用 $emit 方法觸發事件,並使用 v-on 指令在父組件中監聽。

See all articles