国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

uniapp 上傳壓縮圖片 兼容h5和小程序的方法

這篇具有很好參考價(jià)值的文章主要介紹了uniapp 上傳壓縮圖片 兼容h5和小程序的方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

項(xiàng)目是用uniapp開發(fā)的,當(dāng)時(shí)只是做App端,后來項(xiàng)目擴(kuò)展到H5端, uniapp框架可以跨平臺(tái)所以移動(dòng)端和H5使用的是一套代碼
上傳頭像的時(shí)候要求圖片的大小在2MB一下,所以要壓縮圖片,App端當(dāng)時(shí)使用的是uni.compressImage(OBJECT)壓縮的(詳情見:https://uniapp.dcloud.net.cn/api/media/image.html#compressimage 但是H5不兼容;
先搞定H5的壓縮吧!網(wǎng)上一搜一大把


/** 
 * H5壓縮 二分查找算法來找到一個(gè)合適的圖像質(zhì)量系數(shù),使得壓縮后的圖片文件大小接近于目標(biāo)大小
 * @param {Object} imgSrc 圖片url 
 * @param {Object} callback 回調(diào)設(shè)置返回值 
 * */
 export function compressH5(fileItem, targetSizeKB, initialQuality = 1.0) {
     const maxQuality = 1.0;
     const minQuality = 0.0;
     const tolerance = 0.01; // 根據(jù)需要調(diào)整公差
     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) {
                             // 當(dāng)前質(zhì)量足夠接近目標(biāo)大小,使用當(dāng)前質(zhì)量解析
                             resolve(URL.createObjectURL(blob));
                         } else if (fileSizeKB > targetSizeKB) {
                             // 如果文件大小太大,降低質(zhì)量,繼續(xù)二分查找
                             binarySearch(min, midQuality);
                         } else {
                             // 如果文件大小太小,增加質(zhì)量,繼續(xù)二分查找
                             binarySearch(midQuality, max);
                         }
                     }, 'image/jpeg', midQuality);
                 };
             };
             reader.onerror = function (error) {
                 reject(error);
             };
         };
 
         // 開始二分查找
         binarySearch(minQuality, maxQuality);
     });
 }


調(diào)用方法

			chooseImg1() {
			    uni.chooseImage({
					count: 1, //默認(rèn)9
					sizeType:['compressed'],
			        success: (chooseImageRes) => {
			            const tempFilePaths = chooseImageRes.tempFilePaths;
			            const filePath = tempFilePaths[0];
			            // 獲取圖片文件大小
			            uni.getFileInfo({
			                filePath: filePath,
			                success: (fileInfo) => {
			                    const fileSize = fileInfo.size; // 圖片文件大小,單位為B
			                    // 判斷圖片大小是否超過200KB
			                    if (fileSize > 200 * 1024) {
									//#ifdef H5
									 //h5壓縮圖片
																		 const targetSizeKB = 150; // 設(shè)置目標(biāo)文件大小,單位為KB,根據(jù)需求調(diào)整
compressH5(chooseImageRes.tempFiles[0],targetSizeKB).then(file => {
											console.log('file 222 = ', file)
											this.uploadCompressedImage(file);
											}).catch(err => {
												console.log('catch', err)
									 })
									//#endif
									//#ifdef APP-PLUS || MP-WEIXIN
			                        // 如果超過200KB,進(jìn)行壓縮
			                        uni.compressImage({
			                            src: filePath,
			                            quality: 10, // 設(shè)置壓縮質(zhì)量(0-100)- 根據(jù)需求進(jìn)行調(diào)整
			                            success: (compressRes) => {
			                                // 壓縮成功后的邏輯
			                                this.uploadCompressedImage(compressRes.tempFilePath);
			                            },
			                            fail: (err) => {
			                                console.error('壓縮圖片失敗:', err);
			                                uni.showToast({
			                                    title: '壓縮圖片失敗,請(qǐng)重試',
			                                    icon: 'none'
			                                });
			                            }
			                        });
									//#endif
			                    } else {
			                        // 如果未超過200KB,直接上傳原圖
			                        this.uploadCompressedImage(filePath);
			                    }
			                },
			                fail: (err) => {
			                    console.error('獲取文件信息失敗:', err);
			                    uni.showToast({
			                        title: '獲取文件信息失敗,請(qǐng)重試',
			                        icon: 'none'
			                    });
			                }
			            });
			        },
			        fail: (err) => {
			            console.error('選擇圖片失敗:', err);
			            uni.showToast({
			                title: '選擇圖片失敗,請(qǐng)重試',
			                icon: 'none'
			            });
			        }
			    });
			},
	uploadCompressedImage(filePath) {
			        uni.uploadFile({
			            url: `${this.$VUE_APP_API_URL}/common/image/image/upload/faceImg`,
						filePath: filePath,
			            name: 'file',
			            header: {
			                'Authorization': uni.getStorageSync('X-Token'), // 修改為你的訪問令牌
			            },
						success: (res) => {
							uni.hideLoading(); // 隱藏 loading
							if (res.statusCode === 200) {
								console.log('上傳成功:', res.data);
								const responseData = JSON.parse(res.data); // 解析返回的數(shù)據(jù)
								console.log(responseData,'responseData')
								// 處理上傳成功后的邏輯
								if(responseData.code==200){
									this.contractImage1 = responseData.data
									uni.setStorageSync('faceUrl',this.contractImage1)
								}else{
									uni.$u.toast(responseData.msg);
								}
							} else {
								console.error('上傳失敗', res.statusCode);
								uni.showToast({
									title: res.msg, // 自定義錯(cuò)誤信息
									icon: 'none'
								});
							}
						},
			            fail: (err) => {
			                console.error('上傳失敗:', err);
			                uni.showToast({
			                    title: '上傳失敗,請(qǐng)重試',
			                    icon: 'none'
			                });
			            }
			        });
			    },

即能兼容h5也能兼容微信小程序和各個(gè)app

微信小程序圖片壓縮再次用二分查找壓縮質(zhì)量





// 壓縮圖片
export function compressImage(filePath, quality, successCallback, errorCallback) {
    uni.compressImage({
        src: filePath,
        quality: quality,
        success: (res) => {
            successCallback(res.tempFilePath);
        },
        fail: (err) => {
            errorCallback(err);
        }
    });
}

// 二分查找壓縮質(zhì)量
export function binarySearchCompress(filePath, targetSize, low, high, successCallback, errorCallback) {
    if (low > high) {
        errorCallback("無法達(dá)到目標(biāo)大小");
        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 {
                    // 遞歸調(diào)整壓縮質(zhì)量
                    binarySearchCompress(filePath, targetSize, low, mid - 1, successCallback, errorCallback);
                }
            },
            fail: (err) => {
                errorCallback(err);
            }
        });
    }, (err) => {
        errorCallback(err);
    });
}

vue文件引用文章來源地址http://www.zghlxwxcb.cn/news/detail-854619.html

//#ifdef APP-PLUS || MP-WEIXIN
			                        // 如果超過200KB,進(jìn)行壓縮
												
									  const tempFilePath = chooseImageRes.tempFilePaths[0];
									  const targetSizeKB = 200;
									  // 將目標(biāo)大小轉(zhuǎn)換為字節(jié)數(shù)
									  const targetSize = targetSizeKB * 1024;
									  // 初始?jí)嚎s質(zhì)量范圍
									  const lowQuality = 1;
									  const highQuality = 100;
									  binarySearchCompress(tempFilePath, targetSize, lowQuality, highQuality, (compressedFilePath) => {
									      console.log("壓縮成功,壓縮后圖片路徑:", compressedFilePath);
										     this.uploadCompressedImage(compressedFilePath);
										  
									  }, (err) => {
									      console.error("壓縮失?。?, err);
									  })

									//#endif

到了這里,關(guān)于uniapp 上傳壓縮圖片 兼容h5和小程序的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • uniApp移動(dòng)端-H5-微信小程序上傳文件(圖片,文檔和視頻等)

    封裝了一個(gè)插件可直接使用: 插件地址:uniApp移動(dòng)端-H5-小程序上傳文件(圖片,文檔和視頻等),插件可直接用Hbuilderx導(dǎo)入示例項(xiàng)目查看, 實(shí)現(xiàn)方法: H5內(nèi)部是使用uni-app官方內(nèi)部方法uni.chooseFile 小程序端因hybrid不能使用本地HTML,所以插件提供的是uni-app官方內(nèi)部方法wx.cho

    2024年02月12日
    瀏覽(99)
  • uniapp-圖片壓縮(適配H5,APP)

    uniapp本身是自帶壓縮圖片的方式的,但是他只適用于APP,做不到多端的適配,如果只考慮app,就非常容易實(shí)現(xiàn)了。 使用uni.compressImage()這個(gè)API即可 要適配H5和APP可以使用canvas的方式進(jìn)行壓縮 原理:按照需求等比例創(chuàng)建空白畫布,將圖片粘到畫布上,最后保存畫布的base64流

    2024年02月07日
    瀏覽(83)
  • uni-app - 頭像圖片裁剪組件(支持多種裁剪,手勢(shì)控制旋轉(zhuǎn)或縮放、內(nèi)外部控制圖片移動(dòng)、提供上傳后端接口方案、頭像圖片美化)全端完美兼容 H5 App 小程序,最好用的圖片上傳后裁剪插件教程源代碼

    uni-app - 頭像圖片裁剪組件(支持多種裁剪,手勢(shì)控制旋轉(zhuǎn)或縮放、內(nèi)外部控制圖片移動(dòng)、提供上傳后端接口方案、頭像圖片美化)全端完美兼容 H5 App 小程序,最好用的圖片上傳后裁剪插件教程源代碼

    網(wǎng)上的教程代碼非常亂且都有 BUG 存在,非常難移植到自己的項(xiàng)目中,而且很難。 實(shí)現(xiàn)了 完美兼容 H5 App 小程序,選取手機(jī)本地相冊(cè)或拍照,圖片上傳裁切內(nèi)置多種方案,樣式隨便改, 本文代碼干凈整潔注釋詳細(xì),您一鍵復(fù)制源碼后參照示例幾分鐘就能完事, 如下圖 真機(jī)測(cè)

    2024年02月17日
    瀏覽(85)
  • uniapp 上傳圖片時(shí)壓縮圖片

    提示:這里簡(jiǎn)述項(xiàng)目相關(guān)背景: 最近用uniapp做一個(gè)上傳圖片,要把圖片大小壓縮到200kb,然后傳給后端 image-conversion:一個(gè)簡(jiǎn)單易用的JS圖像轉(zhuǎn)換工具,可以指定大小以壓縮圖像 npm i image-conversion --save const imageConversion = require(“@/components/image-conversion”);

    2024年02月12日
    瀏覽(25)
  • uniapp 之 多端實(shí)現(xiàn)圖片壓縮(含H5實(shí)現(xiàn))

    uniapp 之 多端實(shí)現(xiàn)圖片壓縮(含H5實(shí)現(xiàn))

    compressImage 說明 文檔平臺(tái)差異說明已標(biāo)出:官網(wǎng)提供的api uni.compressImage 除了 H5 平臺(tái),其余平臺(tái)都支持,所以我們利用條件編譯,然后單獨(dú)處理一下H5的圖片壓縮即可。 utils.js 里面封裝一下該方法,方便調(diào)用 封裝的這個(gè)方法,只是將圖片地址返回了,也可以根據(jù)具體的實(shí)際場(chǎng)

    2024年02月13日
    瀏覽(86)
  • H5項(xiàng)目中使用微信JS-SDK(以H5項(xiàng)目批量上傳圖片為例,兼容IOS及安卓)

    H5項(xiàng)目中使用微信JS-SDK(以H5項(xiàng)目批量上傳圖片為例,兼容IOS及安卓)

    H5項(xiàng)目中使用微信圖片上傳相關(guān)sdk,主要用于解決 1.安卓手機(jī)無法一次選擇多張圖片進(jìn)行上傳問題;2.控制IOS系統(tǒng)手機(jī)一次可無限量選擇圖片上傳的問題 一、準(zhǔn)備工作:公眾號(hào)配置 驗(yàn)證所需使用的sdk是否符合需求 可在使用場(chǎng)景中,打開微信官方提供的 微信SDKDemo 鏈接,或企業(yè)

    2024年02月07日
    瀏覽(22)
  • uniapp圖片或文件的預(yù)覽和下載,兼容ios+安卓+瀏覽器+企業(yè)微信H5

    在uniapp的APP日常開發(fā)中,我們時(shí)常遇到一些兼容性問題,正如本文所提到的圖片的預(yù)覽和下載。在此功能的開發(fā)中,我常遇到以下四個(gè)問題: 圖片預(yù)覽功能實(shí)現(xiàn),但是PDF,word,xls文件無法打開。 安卓的圖片預(yù)覽和文件查看功能正常,ios系統(tǒng)的手機(jī)卻問題頻出,時(shí)不時(shí)的無法打

    2023年04月10日
    瀏覽(27)
  • uniapp下上傳圖片后圖片裁剪加圖片旋轉(zhuǎn),支持H5和app
  • uniapp實(shí)現(xiàn)掃碼功能兼容小程序和h5

    主要是針對(duì)h5端,uniapp自帶的掃碼方法不支持h5的 對(duì)于h5而言需要借助jweixin來實(shí)現(xiàn),也就是微信的掃碼功能 實(shí)現(xiàn)方式: 可通過npm安裝 npm install?jweixin-module 引入安裝的npm包 import jweixin from \\\'jweixin-module\\\' 在onLoad方法中加載獲取簽名的方法 onLoad() { ?? ??? ??? ?this.wx_sanCode() }

    2024年02月13日
    瀏覽(19)
  • uniapp多行文本展開或收起(兼容h5、微信小程序,其它未測(cè)試)

    uniapp多行文本展開或收起(兼容h5、微信小程序,其它未測(cè)試)

    文本過短時(shí)隱藏按鈕,需要知道文本全部展示的行數(shù) 文本收起時(shí),微信小程序不能直接獲取文本展示的高度 文本展示時(shí),微信小程序不能直接獲取文本收起的高度 所以使用 占位文本 獲取單行文本高度,最終通過計(jì)算得到文本全部展示時(shí)的行數(shù) 本文介紹的方法兼容h5、微信

    2024年02月02日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包