vue 實(shí)現(xiàn)網(wǎng)頁(yè)截圖功能詳解
最近項(xiàng)目有一個(gè)需求,需要上傳圖片,但是客戶上傳的圖片大小不一,所以我們需要規(guī)定客戶的圖片比例,但又需要是客戶所需的,所以就想到了截圖
實(shí)現(xiàn)效果
我們的架構(gòu)是vue,所以用的是一個(gè)vue的截圖插件
安裝插件:npm install vue-cropper --save-dev
引入組件
import Vue from 'vue'; import { VueCropper } from "vue-cropper"; Vue.use(VueCropper)
核心代碼
<div> <span class="spanStyle">產(chǎn)品圖片:</span> <!--整個(gè)圖片預(yù)覽的div--> <div style="display:flex;padding-left: 300px;"> <div class="info-item" style="flex:1;margin-left:-160px;margin-top: -25px"> <label class="btn btn-orange theme-bg-gray theme-white w90" for="uploads" style="display:inline-block;width: 70px;padding: 0;text-align: center;line-height: 28px;" >選擇圖片</label> <input type="file" id="uploads" :value="imgFile" style="position:absolute; clip:rect(0 0 0 0);" accept="image/png, image/jpeg, image/gif, image/jpg" @change="uploadImg($event, 1)"> <div class="line" style="margin-left: -280px;margin-top: 85px;"> <div class="cropper-content" style="margin-top:-60px;margin-left:160px;"> <div class="cropper"> <vueCropper ref="cropper" :img="option.img" :outputSize="option.size" :outputType="option.outputType" :info="true" :full="option.full" :canMove="option.canMove" :canMoveBox="option.canMoveBox" :original="option.original" :autoCrop="option.autoCrop" :autoCropWidth="option.autoCropWidth" :autoCropHeight="option.autoCropHeight" :fixedBox="option.fixedBox" @realTime="realTime" ></vueCropper> </div> <!--截取完的圖片展示div--> <div style="margin-left:700px;"> <div class="show-preview" :style="{'width': '300px', 'height':'150px', 'overflow': 'hidden', 'margin-left': '-650px'}"> <div :style="previews.div" > <img :src="previews.url" :style="previews.img"> </div> </div> </div> </div> </div> </div> </div> </div>
預(yù)覽的方法
data (){ return{ headImg:'', //剪切圖片上傳 crap: false, previews: {}, option: { img: '', outputSize:1, //剪切后的圖片質(zhì)量(0.1-1) full: false,//輸出原圖比例截圖 props名full outputType: 'png', canMove: true, original: false, canMoveBox: true, autoCrop: true, autoCropWidth: 300, autoCropHeight: 150, fixedBox: true }, fileName:'', //本機(jī)文件地址 downImg: '#', imgFile:'', uploadImgRelaPath:'', //上傳后的圖片的地址(不帶服務(wù)器域名) } }, methods:{ // 實(shí)時(shí)預(yù)覽函數(shù) realTime(data) { console.log('realTime') this.previews = data }, //選擇本地圖片 uploadImg(e, num) { console.log('uploadImg'); var _this = this; //上傳圖片 var file = e.target.files[0] _this.fileName = file.name; if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) { alert('圖片類型必須是.gif,jpeg,jpg,png,bmp中的一種') return false } var reader = new FileReader(); reader.onload =(e) => { let data; if (typeof e.target.result === 'object') { // 把Array Buffer轉(zhuǎn)化為blob 如果是base64不需要 data = window.URL.createObjectURL(new Blob([e.target.result])) } else { data = e.target.result } if (num === 1) { _this.option.img = data } else if (num === 2) { _this.example2.img = data } } // // 轉(zhuǎn)化為blob reader.readAsArrayBuffer(file); } }
然后我們要獲取截取完之后的圖片,是通過(guò)Cropper的回調(diào)函數(shù)來(lái)獲取它的圖片,這里我們獲取的是我們轉(zhuǎn)為blob格式的圖片(不轉(zhuǎn)顯示不了)
這邊是因?yàn)楹笈_(tái)就是用file類型接收的,所以我需要再把blob轉(zhuǎn)為file,然后才用formData上傳文件
productAdd(){ this.$refs.cropper.getCropBlob((data) => { //這個(gè)data就是我們截取后的blob圖片 let formData = new FormData(); //獲取文件名,因?yàn)樵谵D(zhuǎn)成file里面不能用this.所以需要用一個(gè)變量來(lái)賦值 var name=this.fileName var file = new File([data], name, {type: data.type, lastModified: Date.now()}); formData.append("files",file) new Promise((resolve, reject) => { productAdd(formData).then(response => { if (response.code == 20000) { Dialog.alert({ title: '提示', message: '保存成功!' }).then(() => { this.back('/productInfo') }); } }).catch(error => { reject(error) }) }) }) }
實(shí)際運(yùn)用到自己的項(xiàng)目中還需改動(dòng),比如編輯圖片還需回顯,上傳多張剪切的圖片等等…
以上就是vue 實(shí)現(xiàn)網(wǎng)頁(yè)截圖功能詳解的詳細(xì)內(nèi)容,更多關(guān)于vue 網(wǎng)頁(yè)截圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue中的v-model,v-bind,v-on的區(qū)別解析
vue.js是一套構(gòu)建用戶界面的框架,只關(guān)注視圖層,它不僅易于上手,還便于與第三方庫(kù)或既有項(xiàng)目整合,vue.js有配套的第三方類庫(kù),可以整合起來(lái)做大型項(xiàng)目的開(kāi)發(fā),這篇文章主要介紹了v-model,v-bind,v-on的區(qū)別,需要的朋友可以參考下2022-12-12vue-manage-system升級(jí)到vue3的開(kāi)發(fā)總結(jié)分析
這篇文章主要為大家介紹了vue-manage-system升級(jí)到vue3的開(kāi)發(fā)總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09vue中watch如何同時(shí)監(jiān)聽(tīng)多個(gè)屬性
這篇文章主要介紹了vue中watch如何同時(shí)監(jiān)聽(tīng)多個(gè)屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Vue代理報(bào)錯(cuò)404問(wèn)題及解決(vue配置proxy)
這篇文章主要介紹了Vue代理報(bào)錯(cuò)404問(wèn)題及解決(vue配置proxy),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12vue 基于element-ui 分頁(yè)組件封裝的實(shí)例代碼
這篇文章主要介紹了vue 基于element-ui 分頁(yè)組件封裝的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12element-plus中如何實(shí)現(xiàn)按需導(dǎo)入與全局導(dǎo)入
本文主要介紹了element-plus中如何實(shí)現(xiàn)按需導(dǎo)入與全局導(dǎo)入,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11vue中element-ui組件默認(rèn)css樣式修改的四種方式
在前端項(xiàng)目中會(huì)運(yùn)用各種組件,有時(shí)組件的默認(rèn)樣式并不是你項(xiàng)目中所需要的,你需要更改樣式,下面這篇文章主要給大家介紹了關(guān)于vue中element-ui組件默認(rèn)css樣式修改的四種方式,需要的朋友可以參考下2021-10-10