最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼)

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 19:32:22
文檔

js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼)

js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。*vue+webpack環(huán)境,這里的that指到vue實例<input type="file" name="fi
推薦度:
導(dǎo)讀js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。*vue+webpack環(huán)境,這里的that指到vue實例<input type="file" name="fi

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

*vue+webpack環(huán)境,這里的that指到vue實例

<input type="file" name="file" accept="image/*" @change="selectImgs" ref="file" />

一、圖片壓縮

 /*
 file:文件(類型是圖片格式),
 obj:文件壓縮后對象width, height, quality(0-1)
 callback:容器或者回調(diào)函數(shù)
 */
 photoCompress(file,obj,callback){
 let that=this;
 let ready=new FileReader();
 /*開始讀取指定File對象中的內(nèi)容. 讀取操作完成時,返回一個URL格式的字符串.*/
 ready.readAsDataURL(file);
 ready.onload=function(){
 let re=this.result;
 that.canvasDataURL(re,obj,callback) //開始壓縮
 }
 },
/*利用canvas數(shù)據(jù)化圖片進(jìn)行壓縮*/
 canvasDataURL(path, obj, callback){
 
 let img = new Image();
 img.src = path;
 img.onload = function(){
 let that = this; //指到img
 // 默認(rèn)按比例壓縮
 let w = that.width,
 h = that.height,
 scale = w / h;
 w = obj.width || w;
 h = obj.height || (w / scale);
 let quality = 0.7; // 默認(rèn)圖片質(zhì)量為0.7
 //生成canvas
 let canvas = document.createElement('canvas');
 let ctx = canvas.getContext('2d');
 // 創(chuàng)建屬性節(jié)點(diǎn)
 let anw = document.createAttribute("width");
 anw.nodeValue = w;
 let anh = document.createAttribute("height");
 anh.nodeValue = h;
 canvas.setAttributeNode(anw);
 canvas.setAttributeNode(anh);
 ctx.drawImage(that, 0, 0, w, h);
 // 圖像質(zhì)量
 if(obj.quality && obj.quality <= 1 && obj.quality > 0){
 quality = obj.quality;
 }
 // quality值越小,所繪制出的圖像越模糊
 let base64 = canvas.toDataURL('image/jpeg', quality);
 // 回調(diào)函數(shù)返回base64的值
 callback(base64);
 }
 },

二、base64轉(zhuǎn)文件

這里后臺接口不支持base64,根據(jù)實際接口情況使用

 /*這里轉(zhuǎn)為blob*/
 convertBase64UrlToBlob(urlData){
 let arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],
 bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
 while(n--){
 u8arr[n] = bstr.charCodeAt(n);
 }
 return new Blob([u8arr], {type:mime});
 },

三、上傳圖片

 selectImgs(e) { //選擇文件后執(zhí)行
 let that=this
 let fileObj=e.target.files[0] //獲取file
 //console.log(fileObj)
 var form = new FormData(); // 創(chuàng)建FormData 對象
 if(fileObj.size/1024 > 1025) { //文件大于1M,進(jìn)行壓縮上傳
 that.photoCompress(fileObj, { //調(diào)用壓縮圖片方法
 quality: 0.2
 }, function(base64Codes){
 //console.log("壓縮后:" + base.length / 1024 + " " + base);
 let bl = that.convertBase64UrlToBlob(base64Codes);
 //console.log(bl)
 form.append("file", bl, "file_"+Date.parse(new Date())+".jpg"); // 文件對象
 that.imgRequest(form); //請求圖片上傳接口
 });
 }else{ //小于等于1M 原圖上傳
 form.append("file", fileObj); // 文件對象
 that.imgRequest(form); //請求圖片上傳接口
 }
 },
 /*圖片上傳接口*/
 imgRequest(param){
 PostSaveImg( //封裝的ajax(axios)方法
 param
 ).then(data => {
 if (data.status === 200 || data.status === 304){
 let item={
 path:this.imgpath+data.data[0].path,
 }
 let jsonitem={
 jlid:this.jlid,
 path:data.data[0].path,
 xxdm:this.xxdm,
 }
 this.imglistJson.push(jsonitem)
 this.imglist.push(item)
 }else{
 Toast({ //封裝的提示方法
 message: '圖片上傳失敗',
 position: 'middle',
 duration: 2000
 })
 } 
 })
 
 /*原生請求*/
 // const xhr = new XMLHttpRequest() 
 // xhr.open('POST', HOSTMOBILE+'api/mobile/xcjg/sctp', true) //接口地址
 // xhr.send(param)
 // xhr.onload = () => {
 // if (xhr.status === 200 || xhr.status === 304) {
 // let datas = JSON.parse(xhr.responseText)
 // console.log('response: ', datas)
 // } else {
 // alert(`${xhr.status} 請求錯誤!`)
 // }
 // }
 
 },

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼)

js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于js如何實現(xiàn)一張圖片的壓縮與上傳(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。*vue+webpack環(huán)境,這里的that指到vue實例<input type="file" name="fi
推薦度:
標(biāo)簽: 圖片 上傳 壓縮圖片
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top