uniapp圖片壓縮之后在上傳

壓縮圖片js方法,新建imgPress.js

/** * H5壓縮 二分查找算法來找到一個合適的圖像質量系數,使得壓縮后的圖片文件大小接近于目標大小* @param {Object} imgSrc 圖片url * @param {Object} callback 回調設置返回值 * */
export function compressH5(fileItem, targetSizeKB, initialQuality = 1.0) {const maxQuality = 1.0;const minQuality = 0.0;const tolerance = 0.01; // 根據需要調整公差return new Promise((resolve, reject) => {const binarySearch = (min, max) => {const midQuality = (min + max) / 2;const reader = new FileReader();reader.readAsDataURL(fileItem);reader.onload = function () {const img = new Image();img.src = this.result;img.onload = function () {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = img.width;canvas.height = img.height;ctx.clearRect(0, 0, canvas.width, canvas.height);ctx.drawImage(img, 0, 0, canvas.width, canvas.height);// 使用異步的 toBlob 方法canvas.toBlob(async (blob) => {const fileSizeKB = blob.size / 1024;if (Math.abs(fileSizeKB - targetSizeKB) < tolerance || max - min < tolerance) {// 當前質量足夠接近目標大小,使用當前質量解析resolve(URL.createObjectURL(blob));} else if (fileSizeKB > targetSizeKB) {// 如果文件大小太大,降低質量,繼續二分查找binarySearch(min, midQuality);} else {// 如果文件大小太小,增加質量,繼續二分查找binarySearch(midQuality, max);}}, 'image/jpeg', midQuality);};};reader.onerror = function (error) {reject(error);};};// 開始二分查找binarySearch(minQuality, maxQuality);});
}// app 或小程序壓縮圖片
// 壓縮圖片
export function compressImage(filePath, quality, successCallback, errorCallback) {uni.compressImage({src: filePath,quality: quality,success: (res) => {successCallback(res.tempFilePath);},fail: (err) => {errorCallback(err);}});
}// 二分查找壓縮質量
export function binarySearchCompress(filePath, targetSize, low, high, successCallback, errorCallback) {if (low > high) {errorCallback("無法達到目標大小");return;}const mid = Math.floor((low + high) / 2);compressImage(filePath, mid, (tempFilePath) => {uni.getFileInfo({filePath: tempFilePath,success: (res) => {const currentSize = res.size;if (currentSize <= targetSize) {successCallback(tempFilePath);} else {// 遞歸調整壓縮質量binarySearchCompress(filePath, targetSize, low, mid - 1, successCallback, errorCallback);}},fail: (err) => {errorCallback(err);}});}, (err) => {errorCallback(err);});
}

vue 頁面調用

import {compressH5,binarySearchCompress} from './imgPress'

方法引入,注意:uploadCompressedImage方法上傳里七牛云上傳就需要七牛云token,里面處理圖片可以根據需求修改,如果是上傳后臺,可以用后臺方法上傳。

// 上傳圖片upload(key){const that = thisuni.chooseImage({count: 1, //默認9sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有success: res => {console.log(res)// 獲取文件的臨時路徑let avatar = res.tempFilePaths[0];let files = res.tempFiles[0]const fileSize = files.size;console.log('fileSize',fileSize)if(fileSize/1024/1024 >20){return that.$tools.toast('請上傳20M以內的圖片')}uni.showLoading({mask: true,});// 判斷圖片大小是否超過200KBif (fileSize > 200 * 1024) {//#ifdef H5//h5壓縮圖片const targetSizeKB = 150; // 設置目標文件大小,單位為KB,根據需求調整compressH5(files,targetSizeKB).then(file => {console.log('file 222 = ', file)that.uploadCompressedImage(file,key);}).catch(err => {console.log('catch', err)uni.hideLoading();})//#endif//#ifdef APP-PLUS || MP-WEIXIN// 如果超過200KB,進行壓縮// 初始壓縮質量范圍const lowQuality = 1;const highQuality = 100;binarySearchCompress(files, targetSize, lowQuality, highQuality, (compressedFilePath) => {console.log("壓縮成功,壓縮后圖片路徑:", compressedFilePath);that.uploadCompressedImage(file,key);}, (err) => {console.error("壓縮失敗:", err);uni.hideLoading();})//#endif} else {// 如果未超過200KB,直接上傳原圖that.uploadCompressedImage(avatar,key);}},fail: (error) => {console.log(error);that.$tools.toast('上傳圖片接口調用失敗')uni.hideLoading();},})},// 壓縮上傳uploadCompressedImage(avatar,key){const that = this// let avatar = res.tempFiles;let KeySrc = key+'Src'console.log(key,avatar)that[KeySrc] = avatar;that.$set(that,KeySrc,avatar)let now_time = new Date().getTime();uni.uploadFile({url: 'https://up-z2.qiniup.com', filePath: avatar,name: 'file',formData: {// 'key': now_time,'token': that.qiniu.qiniu_token,},success: (uploadFileRes) => {let uploadImgUrl = JSON.parse(uploadFileRes.data).key;// let backUrl = that.qiniu.qiniu_domain + '/' +uploadImgUrl;let backUrl = uploadImgUrl;that[key] = backUrl;that.$set(that,key,backUrl)console.log(key,this[key])uni.hideLoading();},fail: (error) => {console.log(error);uni.hideLoading();},complete: () => {setTimeout(function() {uni.hideLoading();}, 250);},});},

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

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

相關文章

nginx熱更新詳解及實戰操作

Nginx熱更新&#xff0c;也被稱為平滑升級或熱部署&#xff0c;是指在不中斷Nginx服務的情況下&#xff0c;對Nginx進行升級或更新其配置&#xff0c;以實現業務的無損和用戶無感知的升級過程。以下是關于Nginx熱更新的詳細解釋&#xff1a; 一、Nginx熱更新的原理 Nginx熱更…

Kubernetes APIServer 幾種基本認證方式

"認證"&#xff0c;形象地理解就是"你是誰"。在上文中&#xff0c;用戶A在發起API請求時&#xff0c;管理員如何道該請求是用戶A發起的呢&#xff1f;所以&#xff0c;客戶端在發起API請求時&#xff0c;必須要攜帶一個身份信息來表明"我是誰"&a…

泰勒公式中拉格朗日余項和佩亞諾余項的區別及具體的應用場景案例

泰勒公式是微積分中的一個重要工具&#xff0c;用于將一個函數在某一點附近展開成多項式形式&#xff0c;以便于近似計算和分析。泰勒公式的一般形式為&#xff1a; f ( x ) f ( a ) f ′ ( a ) ( x ? a ) f ′ ′ ( a ) 2 ! ( x ? a ) 2 ? f ( n ) ( a ) n ! ( x ? a…

[CTF]-PWN:House of Cat堆題型綜合解析

原理&#xff1a; 調用順序&#xff1a; exit->_IO_wfile_jumps->_IO_wfile_seekoff->_IO_switch_to_wget_mode _IO_wfile_seekoff源碼&#xff1a; off64_t _IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode) {off64_t result;off64_t delta, new…

AI繪畫小白必備!Stable Diffusion常用插件合集,好用推薦!(附插件下載)

前言 寶子們&#xff0c;早上好啊~Stable Diffusion 常用插件&#xff0c;月月已經給大家整理好了&#xff0c;自取就好。 擁有這些SD常用插件&#xff0c;讓您的圖像生成和編輯過程更加強大、直觀、多樣化。以下插件集成了一系列增強功能&#xff0c;覆蓋從自動補全提示詞到…

開源項目:驅動創新與協作的時代引擎

《開源項目&#xff1a;驅動創新與協作的時代引擎》 在當今全球經濟與科技環境瞬息萬變的背景下&#xff0c;開源軟件項目如同一顆璀璨的新星&#xff0c;在開發者社區的天空中熠熠生輝。其蓬勃發展的態勢不僅成為了熱門話題&#xff0c;更是引領著技術領域的變革潮流。 開源…

無法訪問。你可能沒有權限使用網絡資源。請與這臺服務器的管理員聯系以查明你是否有訪問權限。【解決辦法】

問題描述 新建好一臺windows虛擬機&#xff0c;兩臺設備網絡是互通的&#xff0c;但是物理機在訪問虛擬機的網絡共享文件資源時&#xff0c;出現圖下所示的報錯&#xff1a;XXX無法訪問。你可能沒有權限使用網絡資源。請與這臺服務器的管理員聯系以查明你是否有訪問權限。用戶…

echarts無法加載Map地圖的問題

項目場景&#xff1a; echarts無法加載Map地圖的問題 詳情 查閱相關資料講&#xff0c;echarts4.9以上版本已經移除了map&#xff0c;那么我們就得重新打包echarts文件了。打包echarts.min.js的鏈接&#xff1a;https://echarts.apache.org/zh/builder.html 在這個鏈接頁面可…

考完軟考之后,如何評職稱?是否有有效期?

一、軟考和職稱之間的關系 軟考和職稱之間的關系可以這樣理解&#xff1a;拿到軟考證書并不意味著就能獲得職稱。軟考證書是技術等級證書&#xff0c;而職稱則是一種資格。如果單位聘用你做工程師&#xff0c;那么你的軟考證書就可以發揮作用&#xff0c;相當于獲得了職稱證。…

單商戶和多商戶的區別

單商戶商城通常由單個企業或品牌運營&#xff0c;專注于銷售自家產品&#xff0c;而多商戶商城則類似于一個平臺&#xff0c;允許多個商家入駐并銷售各自的商品。它們在經營模式、商家入駐和運營投入等方面有所不同。具體分析如下&#xff1a; 經營模式 單商戶商城&#xff1…

MES:連接計劃與執行的橋梁

想象一下&#xff0c;你的企業擁有一份完美的生產計劃&#xff0c;但如何將這份計劃準確無誤地轉化為實際生產中的每一步操作&#xff1f;這就是MES大展身手的地方。MES作為ERP&#xff08;企業資源計劃&#xff09;與車間自動化控制之間的橋梁&#xff0c;確保生產計劃能夠順暢…

hf-mirror (huggingface 的國內鏡像)

官網&#xff1a; https://hf-mirror.com/ 網站域名 hf-mirror.com&#xff0c;用于鏡像 huggingface.co 域名。作為一個公益項目&#xff0c;致力于幫助國內AI開發者快速、穩定的下載模型、數據集。 如何使用HF-Mirror 方法一&#xff1a;網頁下載 在https://hf-mirror.com/…

邊框插畫:成都亞恒豐創教育科技有限公司

邊框插畫&#xff1a;藝術與生活的精致邊界 在視覺藝術的廣闊天地里&#xff0c;邊框插畫以其獨特的魅力和細膩的表達方式&#xff0c;成為連接藝術與生活的一道精致邊界。成都亞恒豐創教育科技有限公司它不僅僅是圖像的外框裝飾&#xff0c;更是情感、故事與創意的延伸&#…

看到指針就頭疼?這篇文章讓你對指針有更全面的了解!

文章目錄 1.什么是指針2.指針和指針類型2.1 指針-整數2.2 指針的解引用 3.野指針3.1為什么會有野指針3.2 如何規避野指針 4.指針運算4.1 指針-整數4.2 指針減指針4.3 指針的關系運算 5.指針與數組6.二級指針7.指針數組 1.什么是指針 指針的兩個要點 1.指針是內存中的一個最小單…

【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix

【Python】ModuleNotFoundError: No module named distutils.util bug fix 1. error like this2. how to fix why this error occured , because i remove the origin version python of ubuntu of 20.04. then the system trapped in tty1 , you must make sure the laptop li…

MVC 返回集合方法,以及分頁

返回一個數據集方法 返回多個數據集方法 》》定義一個Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

微信小程序中wx.navigateBack()頁面棧返回上一頁時執行上一頁的方法或修改上一頁的data屬性值

let pages getCurrentPages();let prevPage pages[pages.length - 2]; // 獲取上一個頁面實例對象console.log(prevPage) //打印信息// 在 wx.navigateBack 的 success 回調中執行需要的方法wx.navigateBack({delta: 1, // 返回上一頁success: function() {//修改上一頁的屬性…

秒懂設計模式--學習筆記(8)【結構型-組合模式】

目錄 7、組合模式7.1 組合模式&#xff08;Composite&#xff09;7.2 叉樹結構7.3 文件系統7.4 目錄樹展示7.5 自相似性的涌現7.6 組合模式的各角色定義7.7 組合 7、組合模式 7.1 組合模式&#xff08;Composite&#xff09; 是針對由多個節點對象&#xff08;部分&#xff0…

關于string的‘\0‘與string,vector構造特點,反迭代器與迭代器類等的討論

目錄 問題一&#xff1a;關于string的\0問題討論 問題二&#xff1a;C標準庫中的string內存是分配在堆上面嗎&#xff1f; 問題三&#xff1a;string與vector的capacity大小設計的特點 問題四&#xff1a;string的流提取問題 問題五&#xff1a;迭代器失效 問題六&#xf…

個人開發實現AI套殼網站快速搭建(Vue+elementUI+SpringBoot)

目錄 一、效果展示 二、項目概述 三、手把手快速搭建實現本項目 3.1 前端實現 3.2 后端方向 五、后續開發計劃 一、效果展示 默認展示 一般對話展示&#xff1a; 代碼對話展示&#xff1a; 二、項目概述 本項目是一個基于Web的智能對話服務平臺&#xff0c;通過后端與第…