vue使用vue-cropper實現圖片裁剪之單圖裁剪

vue制作的pc系統中(如若依系統),需要實現按照固定尺寸進行裁剪后再進行圖片上傳,以下代碼講述的是實現單張圖片裁剪上傳。

1.第一步需要安裝vue-cropper
npm install vue-cropper
2.第二步在需要的頁面進入代碼引入

import {VueCropper} from "vue-cropper"
3.第三步封裝子組件
<template><div><div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="點擊上傳頭像" class="img-lg" /></div><el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened"  @close="closeDialog"><el-row><el-col :xs="24" :md="12" :style="{height: '350px'}"><vue-cropperref="cropper":img="options.img":info="true":autoCrop="options.autoCrop":autoCropWidth="options.autoCropWidth":autoCropHeight="options.autoCropHeight":fixedBox="options.fixedBox":outputType="options.outputType"@realTime="realTime"v-if="visible"/></el-col><el-col :xs="24" :md="12" :style="{height: '350px'}"><div class="avatar-upload-preview-update"><img :src="previews.url" :style="previews.img" /></div></el-col></el-row><br /><el-row><el-col :lg="2" :sm="3" :xs="3"><el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload"><el-button size="small">選擇<i class="el-icon-upload el-icon--right"></i></el-button></el-upload></el-col><el-col :lg="{span: 1, offset: 2}" :sm="2" :xs="2"><el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button></el-col><el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"><el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button></el-col><el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"><el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button></el-col><el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"><el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button></el-col><el-col :lg="{span: 2, offset: 6}" :sm="2" :xs="2"><el-button type="primary" size="small" @click="uploadImg()">提 交</el-button></el-col></el-row></el-dialog></div>
</template><script>
import store from "@/store"
import { VueCropper } from "vue-cropper"
import { uploadCommonImg } from "@/api/system/user"
import { debounce } from '@/utils'export default {components: { VueCropper },props: {url: {type: String,default: ""},},data() {return {// 是否顯示彈出層open: false,// 是否顯示croppervisible: false,// 彈出層標題title: "修改頭像",options: {img: '',  //裁剪圖片的地址autoCrop: true,             // 是否默認生成截圖框autoCropWidth: 162,         // 默認生成截圖框寬度autoCropHeight: 200,        // 默認生成截圖框高度fixedBox: true,             // 固定截圖框大小 不允許改變outputType:"png",           // 默認生成截圖為PNG格式filename: 'avatar'          // 文件名稱},previews: {},resizeHandler: null}},mounted() {this.options.img= this.url?(process.env.VUE_APP_BASE_API +this.url):''},methods: {// 編輯頭像editCropper() {this.open = true},// 打開彈出層結束時的回調modalOpened() {this.visible = trueif (!this.resizeHandler) {this.resizeHandler = debounce(() => {this.refresh()}, 100)}window.addEventListener("resize", this.resizeHandler)},// 刷新組件refresh() {this.$refs.cropper.refresh()},// 覆蓋默認的上傳行為requestUpload() {},// 向左旋轉rotateLeft() {this.$refs.cropper.rotateLeft()},// 向右旋轉rotateRight() {this.$refs.cropper.rotateRight()},// 圖片縮放changeScale(num) {num = num || 1this.$refs.cropper.changeScale(num)},// 上傳預處理beforeUpload(file) {if (file.type.indexOf("image/") == -1) {this.$modal.msgError("文件格式錯誤,請上傳圖片類型,如:JPG,PNG后綴的文件。")} else {const reader = new FileReader()reader.readAsDataURL(file)reader.onload = () => {this.options.img = reader.resultthis.options.filename = file.name}}},// 上傳圖片uploadImg() {this.$refs.cropper.getCropBlob(data => {let formData = new FormData()formData.append("file", data, this.options.filename)uploadCommonImg(formData).then(response => {this.open = falsethis.options.img = process.env.VUE_APP_BASE_API + response.fileNameconsole.log('this.options.img',this.options.img)this.$emit('outUrl', response.fileName)this.visible = false})})},// 實時預覽realTime(data) {this.previews = data},// 關閉窗口closeDialog() {// this.options.img =''this.visible = falsewindow.removeEventListener("resize", this.resizeHandler)}}
}
</script>
<style scoped lang="scss">
.user-info-head {position: relative;display: inline-block;height: 120px;
}.user-info-head:hover:after {content: '+';position: absolute;left: 0;right: 0;top: 0;bottom: 0;color: #eee;background: rgba(0, 0, 0, 0.5);font-size: 24px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;cursor: pointer;line-height: 110px;//border-radius: 50%;text-align: center;
}
</style>
4.第四步,父級頁面引入該子組件
 //其中url是父組件進行子組件的初始化傳值  outUrl是接收子組件傳遞過來的參數 <imgCrop @outUrl="getUrl" :url="form.peoImage"/>
5.第五步 接收子組件傳遞過來的參數
 getUrl(url) {this.form.peoImage = url},

因為我用的若依系統,ruoyi.css中集成了上述組件中的樣式 ,粘貼如下:

/**
* 通用css樣式布局處理
* Copyright (c) 2019 ruoyi
*//** 基礎通用 **/
.pt5 {padding-top: 5px;
}.pr5 {padding-right: 5px;
}.pb5 {padding-bottom: 5px;
}.mt5 {margin-top: 5px;
}.mr5 {margin-right: 5px;
}.mb5 {margin-bottom: 5px;
}.mb8 {margin-bottom: 8px;
}.ml5 {margin-left: 5px;
}.mt10 {margin-top: 10px;
}.mr10 {margin-right: 10px;
}.mb10 {margin-bottom: 10px;
}
.ml10 {margin-left: 10px;
}.mt20 {margin-top: 20px;
}.mr20 {margin-right: 20px;
}.mb20 {margin-bottom: 20px;
}
.ml20 {margin-left: 20px;
}.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {font-family: inherit;font-weight: 500;line-height: 1.1;color: inherit;
}.el-message-box__status + .el-message-box__message{word-break: break-word;
}.el-dialog:not(.is-fullscreen) {margin-top: 6vh !important;
}.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body {overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;
}.el-table {.el-table__header-wrapper, .el-table__fixed-header-wrapper {th {word-break: break-word;background-color: #f8f8f9;color: #515a6e;height: 40px;font-size: 13px;}}.el-table__body-wrapper {.el-button [class*="el-icon-"] + span {margin-left: 1px;}}
}/** 表單布局 **/
.form-header {font-size: 15px;color: #6379bb;border-bottom: 1px solid #ddd;margin: 8px 10px 25px 10px;padding-bottom: 5px
}/** 表格布局 **/
.pagination-container {display: flex;justify-content: flex-end;margin-top: 20px;
}/* tree border */
.tree-border {margin-top: 5px;border: 1px solid #e5e6e7;background: #FFFFFF none;border-radius: 4px;
}@media (max-width: 768px) {.pagination-container .el-pagination > .el-pagination__jump {display: none !important;}.pagination-container .el-pagination > .el-pagination__sizes {display: none !important;}
}.el-table .fixed-width .el-button--mini {padding-left: 0;padding-right: 0;width: inherit;
}/** 表格更多操作下拉樣式 */
.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine {cursor: pointer;margin-left: 5px;
}.el-table .el-dropdown, .el-icon-arrow-down {font-size: 12px;
}.el-tree-node__content > .el-checkbox {margin-right: 8px;
}.list-group-striped > .list-group-item {border-left: 0;border-right: 0;border-radius: 0;padding-left: 0;padding-right: 0;
}.list-group {padding-left: 0px;list-style: none;
}.list-group-item {border-bottom: 1px solid #e7eaec;border-top: 1px solid #e7eaec;margin-bottom: -1px;padding: 11px 0px;font-size: 13px;
}.pull-right {float: right !important;
}.el-card__header {padding: 14px 15px 7px;min-height: 40px;
}.el-card__body {padding: 15px 20px 20px 20px;
}.card-box {margin-bottom: 10px;
}/* button color */
.el-button--cyan.is-active,
.el-button--cyan:active {background: #20B2AA;border-color: #20B2AA;color: #FFFFFF;
}.el-button--cyan:focus,
.el-button--cyan:hover {background: #48D1CC;border-color: #48D1CC;color: #FFFFFF;
}.el-button--cyan {background-color: #20B2AA;border-color: #20B2AA;color: #FFFFFF;
}/* text color */
.text-navy {color: #1ab394;
}.text-primary {color: inherit;
}.text-success {color: #1c84c6;
}.text-info {color: #23c6c8;
}.text-warning {color: #f8ac59;
}.text-danger {color: #ed5565;
}.text-muted {color: #888888;
}/* image */
.img-circle {border-radius: 50%;
}.img-lg {width: 120px;height: 120px;
}.avatar-upload-preview {position: relative;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 200px;height: 200px;border-radius: 50%;box-shadow: 0 0 4px #ccc;overflow: hidden;
}
.avatar-upload-preview-update {position: relative;top: 50%;left: 50%;transform: translate(-50%, -50%);width:162px;height: 200px;//border-radius: 50%;box-shadow: 0 0 4px #ccc;overflow: hidden;
}
.swiper-upload-preview-update {position: relative;top: 50%;left: 50%;transform: translate(-50%, -50%);width:352px;height: 150px;//border-radius: 50%;box-shadow: 0 0 4px #ccc;overflow: hidden;
}
/* 拖拽列樣式 */
.sortable-ghost {opacity: .8;color: #fff !important;background: #42b983 !important;
}.top-right-btn {position: relative;float: right;
}/* 分割面板樣式 */
.splitpanes.default-theme .splitpanes__pane {background-color: #fff!important;
}

6.至此完結。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93898.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93898.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93898.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

后臺管理系統-5-vue3之子路由渲染首頁及卡片容器和表格容器實現

文章目錄 1 子路由的實現 1.1 router/index.js 1.2 views/Home.vue(首頁) 1.3 Main.vue 2 左上方的卡片 2.1 分欄間隔(Layout布局) 2.2 卡片容器(el-card) 2.3 整體代碼Home.vue 3 左下方的table(靜態實現) 3.1 準備數據 3.2 渲染表格(el-table) 3.3 整體代碼Home.vue 4 附錄 子…

在CentOS系統中查詢已刪除但仍占用磁盤空間的文件

在CentOS系統中查詢已刪除但仍占用磁盤空間的文件在CentOS系統中查詢已刪除但仍占用磁盤空間的文件1. 檢查磁盤整體使用情況2. 查找被刪除但仍被進程占用的文件3. 釋放磁盤空間4. 替代方案&#xff08;不終止進程&#xff09;注意事項補充工具在CentOS系統中查詢已刪除但仍占用…

正點原子【第四期】Linux之驅動開發學習筆記-1.1 Linux驅動開發與裸機開發的區別

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“正點原子【第四期】手把手教你學Linux系列課程之 Linux驅動開發篇”視頻的學習筆記&#xff0c;該課程配套開發板為正點原子alpha/mini Linux開發板。在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內…

Android SystemServer 中 Service 的創建和啟動方式

今天導師給我將講了一些如何新建一個系統服務&#xff0c;以及如何去初始化。 Android SystemServer 中 Service 的創建和啟動方式 在 Android 系統中&#xff0c;SystemServer 是系統服務的核心進程&#xff0c;負責啟動和管理各種系統服務。以下是 SystemServer 中服務創建和…

SQL SERVER中位數

有11家門店數據&#xff0c;要求每天所有門店的各個指標的中位數1.第一種做法&#xff0c;使用PERCENTILE_CONT&#xff08;&#xff09; 函數 SQL SERVER 2012 版本及以上PERCENTILE_CONT 函數簡介PERCENTILE_CONT 是 SQL 中的窗口函數&#xff0c;用于計算連續百分位數&#…

【java中springboot引入geotool】

學習目標&#xff1a; 在Spring Boot項目中引入GeoTools庫&#xff0c;可以按照以下步驟進行&#xff1a;理解GeoTools庫的基本信息和用途 GeoTools是一個開源的Java庫&#xff0c;用于處理地理信息系統&#xff08;GIS&#xff09;數據。它提供了對空間數據的讀取、寫入、查詢…

多項目開發環境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

如何使用update-alternatives管理多版本Java JDK&#xff1f;&#xff08;Windows、Mac、Ubuntu&#xff09; &#x1f4d6; 摘要 在實際開發中&#xff0c;往往會遇到既要維護老項目又要跟進新特性的場景&#xff0c;這就需要在一臺機器上同時安裝并切換多個Java JDK版本。本…

力扣57:插入區間

力扣57:插入區間題目思路代碼題目 給你一個 無重疊的 &#xff0c;按照區間起始端點排序的區間列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 個區間的開始和結束&#xff0c;并且 intervals 按照 starti 升序排列。同樣給定一個區間 newInterval […

KVM虛擬化技術解析:從企業應用到個人創新的開源力量

1 .KVM&#xff1a;開源虛擬化的核心引擎 KVM&#xff08;Kernel-based Virtual Machine&#xff09;作為Linux內核原生集成的開源虛擬化模塊&#xff0c;徹底改變了現代數據中心的虛擬化格局。它通過將Linux內核轉變為Type-1型虛擬機監控器&#xff08;Hypervisor&#xff09;…

28.Linux :通過源代碼編譯安裝lamp

Linux &#xff1a;通過源代碼編譯安裝lamp 區別特性源代碼編譯安裝yum 安裝安裝方式從源代碼編譯構建預編譯的二進制包自定義程度高度可定制有限定制性能優化可針對特定硬件優化通用優化依賴管理手動解決依賴關系自動解決依賴安裝復雜度復雜&#xff0c;需技術經驗簡單&#x…

應用控制技術

一、 應用特征識別技術1.傳統行為檢測技術1.1 五元組檢測原理1.2 配置思路1.3 效果展示需求背景21.4 傳統行為檢測的缺陷無法識別應用層內容&#xff1a;若應用更換端口&#xff08;如QQ改用隨機端口&#xff09;或偽裝協議&#xff08;如HTTPS加密&#xff09;&#xff0c;傳統…

當MySQL的int不夠用了

關于int的長度很多時候看到int(8)這樣的定義&#xff0c;其實這是工具導出的不專業。int是范圍&#xff0c;不是長度。在開發有了共識&#xff08;知道這個長度不算數&#xff0c;要看范圍&#xff09;以后&#xff0c;上來就是所有的類型都是bigint。int的范圍int的取值范圍是…

讓AI學會“邊做邊想“:ReAct的實戰指南

小智的求職困境有個叫小智的AI助手&#xff0c;它剛從"大語言模型大學"畢業&#xff0c;滿懷信心地去應聘一家咨詢公司的智能助理職位。面試官問&#xff1a;"北京和上海哪個城市人口更多&#xff1f;"小智立刻回答&#xff1a;"根據我的知識&#xf…

vue優化有哪些手段?

vue本身存在的方法 v-if 和v-show 的合理運用,頻繁使用的組件使用v-show,不頻繁的使用v-if,來減少dom的渲染路由懶加載 采用()>import(index.vue)當路由被訪問的時候才回去加載使用keep-alive緩存頁面,減少沒必要的重復渲染同時也可以減少服務器的壓力使用computed緩存數據,…

【圖像算法 - 14】精準識別路面墻體裂縫:基于YOLO12與OpenCV的實例分割智能檢測實戰(附完整代碼)

摘要&#xff1a; 裂縫是結構健康的重要隱患&#xff0c;傳統人工巡檢耗時耗力且易遺漏。本文將帶您利用當前最先進的YOLO12實例分割模型&#xff0c;構建一個高效、準確、更高精度的裂縫檢測系統。我們將從數據準備、模型訓練到結果可視化&#xff0c;手把手實現一個完整的項目…

“讓機器人更智慧 讓具身體更智能”北京世界機器人大會行業洞察

2025年8月8日&#xff0c;世界機器人大會在北京盛大開幕。本屆大會以“讓機器人更智慧 讓具身體更智能”為主題&#xff0c;由中國電子學會、世界機器人合作組織主辦&#xff0c;包括開幕式、閉幕式、論壇等。同期舉辦世界機器人博覽會、世界機器人大賽等活動&#xff0c;打造了…

PHP如何使用JpGraph生成折線圖?

JpGraph是一個功能強大的PHP圖表庫&#xff0c;它通過封裝GD庫函數&#xff0c;為開發者提供了簡單高效的數據可視化解決方案。作為專門用于繪制統計圖的面向對象庫&#xff0c;JpGraph支持創建折線圖、柱狀圖、餅圖等20余種圖表類型&#xff0c;并能自動處理坐標軸、刻度、圖例…

超級云平臺:重構數字生態的“超級連接器“

在數字經濟浪潮席卷全球的今天,企業數字化轉型已從"選擇題"變為"必答題"。然而,傳統云服務模式因技術壁壘高、資源分散、協同效率低等問題,讓許多企業在數字化轉型中陷入"上云易、用云難"的困境。 在此背景下,一種以"全域資源整合+智能…

https如何保證傳遞參數的安全

HTTPS 并非直接“加密參數”&#xff0c;而是通過一整套加密傳輸機制&#xff0c;確保客戶端與服務器之間所有通信內容&#xff08;包括 URL 參數、表單數據、Cookie 等&#xff09;在傳輸過程中不被竊聽、篡改或偽造。其核心安全保障來自以下技術實現&#xff1a; 一、核心加密…

OpenHarmony之打造全場景智聯基座的“分布式星鏈 ”WLAN子系統

1. 技術架構概覽 無線局域網(Wireless Local Area Networks,WLAN),是通過無線電、紅外光信號或者其他技術發送和接收數據的局域網,用戶可以通過WLAN實現結點之間無物理連接的網絡通訊。常用于用戶攜帶可移動終端的辦公、公眾環境中。 WLAN組件子系統為用戶提供WLAN基礎功…