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

uni-app開發(fā)微信小程序,H5 關(guān)于壓縮上傳圖片的問題

這篇具有很好參考價值的文章主要介紹了uni-app開發(fā)微信小程序,H5 關(guān)于壓縮上傳圖片的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

文章目錄

前言

一、為什么要壓縮圖片

二、圖片壓縮方式

1. 微信小程序???????

2. H5

總結(jié)


前言

關(guān)于微信小程序、H5兼容性問題,今天就壓縮以及上傳圖片做一個可實現(xiàn)方法的簡要闡述。


一、為什么要壓縮圖片???????

在使用uni-app開發(fā)小程序及H5的具體業(yè)務(wù)中,我們會遇到需要讓用戶上傳本地圖片的場景,隨著現(xiàn)在的手機像素越來越高,圖片的大小也越來越大,上傳原圖后一方面是難以上傳成功,另一方面是上傳成功后在列表中圖片太大加載時間過長或者加載失敗。若是直接提示用戶 “無法上傳xxM以上的圖片” ,用戶體驗會不好,于是需要我們對用戶上傳的圖片進(jìn)行壓縮。而不同平臺之間壓縮圖片的方式并不完全兼容,需要提供不同的方法來實現(xiàn)。本文主要記錄了在不同平臺實現(xiàn)圖片壓縮上傳的其中一種可實現(xiàn)方法。

二、圖片壓縮方式

uni-app官方提供了關(guān)于圖片的一系列內(nèi)置API

首先從選擇圖片開始

uni.chooseImage(OBJECT)?? ? ?從本地相冊選擇圖片或使用相機拍照。

// 該方法兼容小程序、H5
uni.chooseImage({
    count:1,
	sizeType: ['compressed'],
	success: res => { // success: 成功則返回圖片的本地文件路徑列表
	  let size = res.tempFiles[0].size // 選擇第一張圖片
	  console.log('圖片大小', size, `${size/1000}KB`, `${size/1000/1000}MB`)
    }
})

圖片選擇完畢,下面就是不兼容的地方了 ??

1. 微信小程序???????

小程序壓縮圖片的方式相對比較簡單,不過有一定的局限性,僅對 jpg 格式有效。

uni.compressImage(OBJECT)? ? ?壓縮圖片接口,可選壓縮質(zhì)量。

uni.getfilesystemmanager(),前端,小程序,微信小程序,javascript

?

// 該方法兼容app和小程序,不兼容h5,且僅對jpg格式有效
uni.compressImage({
    src: src, // 圖片路徑
	quality: 10, // 圖片壓縮質(zhì)量,0~100,默認(rèn)80,僅對jpg有效
	success: res => {
	    console.log(res.tempFilePath,'壓縮后的圖片路徑')
        // 接下來可以在這里處理圖片上傳
	}
})

實現(xiàn)圖片上傳

uni.getFileSystemManager()? ? ?獲取全局唯一的文件管理器

readFile()? ? ?讀取文件,可轉(zhuǎn)換編碼格式

// 該方法不兼容h5
uni.getFileSystemManager().readFile({
	filePath: path, // 要讀取的文件路徑
	encoding: 'base64', // 編碼格式
	success: file => {
      wx_uploadImage({ // 調(diào)用接口實現(xiàn)上傳圖片,使用其他方式也可以
	    image: `data:image/png;base64,${file.data}`
	  }).then(res => {
	    console.log('上傳圖片成功', res)
	    this.image = res.storage_path // 賦值或者其他操作
	  })
	}
})

2. H5

H5需要使用另外的方式來壓縮圖片,這里用到了canvas。

- 分三步 -

1. 使用canvas限制圖片大?。▔嚎s圖片),并轉(zhuǎn)換為"blob路徑";

uni.getImageInfo()? ? ?獲取圖片信息???????

uni.getImageInfo({
    src,
	success(res) {
	  console.log('壓縮前', res);
	  let canvasWidth = res.width; // 圖片原始寬度
	  let canvasHeight = res.height; // 圖片原始高度
	  console.log('寬度-',canvasWidth,'高度-',canvasHeight);
	  let img = new Image();
	  img.src = res.path;
	  let canvas = document.createElement('canvas');
	  let ctx = canvas.getContext('2d');
	  // 這里根據(jù)要求限制圖片寬高
	  if (canvasWidth >= 1000) {
	  	canvas.width = canvasWidth * .1;
	  } else {
	  	canvas.width = canvasWidth;
	  }
	  if (canvasHeight >= 1000) {
	  	canvas.height = canvasHeight * .1;
	  } else {
	  	canvas.height = canvasHeight;
	  }
	  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
	  //toBlob()方法創(chuàng)造Blob對象,用以展示canvas上的圖片
	  canvas.toBlob(function(fileSrc) {
	  	let imgSrc = window.URL.createObjectURL(fileSrc);
	  	console.log('壓縮后的blob路徑', imgSrc);
	  });
    }
});

2.?將 "blob路徑" 轉(zhuǎn)換為 "blob文件"(待會轉(zhuǎn)換base64格式圖片需要用到 "blob文件" 的格式)

// 傳入blob路徑,.then()獲取blob文件
httpRequest(src) {
    let that = this
	return new Promise((resolve, reject) => {
	  let xhr = new XMLHttpRequest()
	  xhr.open('GET', src, true)
	  xhr.responseType = 'blob'
	  xhr.onload = function (e) {
	      if (this.status == 200) {
	         let myBlob = this.response
	         let files = new window.File(
	            [myBlob],
	            myBlob.type,
	            { type: myBlob.type }
	         ) // myBlob.type 自定義文件名
	            resolve(files)
	         } else {
	            reject(false)
	         }
	      }
	  xhr.send()
    })
},

3. 將 "blob文件" 轉(zhuǎn)換為 base64格式的圖片,最后上傳圖片。

const fileReader = new FileReader()
fileReader.readAsDataURL(file) // 讀取blob類型的圖像文件(不是blob路徑),讀取成功觸發(fā)onload方法,并得到result(base64格式的圖片)
fileReader.onload = (event) => {
  console.log(fileReader.result,'fileReader.result - base64格式');
  if (fileReader.result) {
    // 調(diào)用wx_uploadImage接口,圖片大小必須是1M以下,否則報錯
    wx_uploadImage({
      image: fileReader.result
    }).then(res => {
      console.log('上傳圖片成功', res)
      this.image = res.storage_path
    })
  }
}

總結(jié)

總結(jié)一下以上邏輯經(jīng)過封裝后的完整代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-781401.html

// 使用條件編譯區(qū)分微信小程序、H5的圖片壓縮上傳方式
// 點擊上傳圖片
chooseImage(){
  uni.chooseImage({
    count:1,
	sizeType: ['compressed'],
	success: res => {
	  let size = res.tempFiles[0].size
	  console.log('圖片大小', size, `${size/1000}KB`, `${size/1000/1000}MB`)
	  			
	  let path = this.picture_show = res.tempFilePaths[0] //本地圖片路徑 - path
	  let file = res.tempFiles[0] //本地圖片文件 - file
      let compressPath = ''
				
	  console.log(path,'路徑');
	  console.log(file,'圖片文件');
				
	  // 先壓縮,再轉(zhuǎn)換為base64圖片,再上傳
				
	  // #ifdef MP-WEIXIN
	  if (size > 1048576) {
		this.mp_compressImage(path)
	  } else {
		this.mp_filetobase64(path)
	  }
	  // #endif
				
	  // #ifdef H5
	  if (size > 1048576) {
	    this.h5_compressImage(path);
	  } else {
		this.h5_filetobase64(file)
	  }
	  // #endif
	}
  })
},

// 微信小程序 - 圖片壓縮方法
mp_compressImage(src) {
  let _this = this
  // 該方法兼容app和小程序,不兼容h5,且僅對jpg格式有效
  uni.compressImage({
    src: src, // 圖片路徑
	quality: 10, // 圖片壓縮質(zhì)量,0~100,默認(rèn)80,僅對jpg有效
	success: res => {
	  console.log(res.tempFilePath,'壓縮后的圖片路徑')
      // 接下來可以在這里處理圖片上傳
      _this.mp_filetobase64(res.tempFilePath)
	}
  })
}

// 微信小程序 - 'blob路徑'轉(zhuǎn)base64圖片的方法
mp_filetobase64(path) {
  // 該方法不兼容h5
  uni.getFileSystemManager().readFile({
	filePath: path, // 要讀取的文件路徑
	encoding: 'base64', // 編碼格式
	success: file => {
      wx_uploadImage({ // 調(diào)用接口實現(xiàn)上傳圖片,使用其他方式也可以
	    image: `data:image/png;base64,${file.data}`
	  }).then(res => {
	    console.log('上傳圖片成功', res)
	    this.image = res.storage_path // 賦值或者其他操作
	  })
	}
  })
}

// h5 - 圖片壓縮方法
h5_compressImage(src) {
  let _this = this;
  uni.getImageInfo({
    src,
	success(res) {
	  console.log('壓縮前', res);
	  let canvasWidth = res.width; // 圖片原始寬度
	  let canvasHeight = res.height; // 圖片原始高度
	  console.log('寬度-',canvasWidth,'高度-',canvasHeight);
	  let img = new Image();
	  img.src = res.path;
	  let canvas = document.createElement('canvas');
	  let ctx = canvas.getContext('2d');
	  // 這里根據(jù)要求限制圖片寬高
	  if (canvasWidth >= 1000) {
	  	canvas.width = canvasWidth * .1;
	  } else {
	  	canvas.width = canvasWidth;
	  }
	  if (canvasHeight >= 1000) {
	  	canvas.height = canvasHeight * .1;
	  } else {
	  	canvas.height = canvasHeight;
	  }
	  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
	  //toBlob()方法創(chuàng)造Blob對象,用以展示canvas上的圖片
	  canvas.toBlob(function(fileSrc) {
	  	let imgSrc = window.URL.createObjectURL(fileSrc);
	  	console.log('壓縮后的blob路徑', imgSrc);
        // 調(diào)用httpRequest方法,把bloburl轉(zhuǎn)換成blob文件
		_this.httpRequest(imgSrc).then(res => {
		    console.log(res,'成功轉(zhuǎn)換為blob文件');
		    _this.h5_filetobase64(res); // 調(diào)用方法,把blob文件轉(zhuǎn)換成base64圖片
		})
	  });
    }
  });
}

// 傳入blob路徑,.then()獲取blob文件
httpRequest(src) {
    let that = this
	return new Promise((resolve, reject) => {
	  let xhr = new XMLHttpRequest()
	  xhr.open('GET', src, true)
	  xhr.responseType = 'blob'
	  xhr.onload = function (e) {
	      if (this.status == 200) {
	         let myBlob = this.response
	         let files = new window.File(
	            [myBlob],
	            myBlob.type,
	            { type: myBlob.type }
	         ) // myBlob.type 自定義文件名
	            resolve(files)
	         } else {
	            reject(false)
	         }
	      }
	  xhr.send()
    })
},

// h5 - 'blob文件'轉(zhuǎn)base64圖片的方法
h5_filetobase64(file) {
  const fileReader = new FileReader()
  fileReader.readAsDataURL(file) // 讀取blob類型的圖像文件(不是blob路徑),讀取成功觸發(fā)onload方法,并得到result(base64格式的圖片)
  fileReader.onload = (event) => {
    console.log(fileReader.result,'fileReader.result - base64格式');
    if (fileReader.result) {
      // 調(diào)用wx_uploadImage接口,圖片大小必須是1M以下,否則報錯
      wx_uploadImage({
        image: fileReader.result
      }).then(res => {
        console.log('上傳圖片成功', res)
        this.image = res.storage_path
      })
    }
  }
}

到了這里,關(guān)于uni-app開發(fā)微信小程序,H5 關(guān)于壓縮上傳圖片的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 前端Uni-app開發(fā)微信小程序|微信小程序手機商城

    前端Uni-app開發(fā)微信小程序|微信小程序手機商城

    作者主頁:編程指南針 作者簡介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、CSDN博客專家 、CSDN內(nèi)容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構(gòu)師設(shè)計經(jīng)驗、騰訊課堂常駐講師 主要內(nèi)容:Java項目、Python項目、前端項目、人工智能與大數(shù)據(jù)、簡歷模板、學(xué)習(xí)資料、面試題庫

    2024年02月12日
    瀏覽(32)
  • uni-app 開發(fā)微信小程序 自動化編譯/啟動項目

    uni-app 開發(fā)微信小程序 自動化編譯/啟動項目

    ??????最近開發(fā)一個uni-app的小程序項目,因為習(xí)慣使用vscode 而項目不得不借助hbuderx 運行,微信開發(fā)工具調(diào)試,偶爾還需要使用 ios模擬器,?8g內(nèi)存的mac 就變的異??D,所以就研究了下通過npm命令去編譯、 運行等工程化配置, 這樣就不用運行hbuderx 減少內(nèi)存使用,順便?

    2024年02月07日
    瀏覽(93)
  • VUE(uni-app框架)開發(fā)微信小程序③-顯示隱藏

    VUE(uni-app框架)開發(fā)微信小程序③-顯示隱藏

    uni-app控制顯示隱藏的方式有兩種,【v-if】?和? ?【v-show】 v-if:通過控制虛擬dom樹的節(jié)點來達(dá)到控制式樣的顯示和隱藏,當(dāng)參數(shù)為false的時候,該節(jié)點被刪掉,當(dāng)為true的時候則顯示。 v-show:通過css樣式中的dispaly:none來控制元素的顯示和隱藏 代碼如下: 顯示效果如下: ?通

    2024年02月16日
    瀏覽(27)
  • 【用vue開發(fā)微信小程序】(uni-app)(自用,不推薦參考)

    【用vue開發(fā)微信小程序】(uni-app)(自用,不推薦參考)

    以前自己只練習(xí)過開發(fā)些原生微信小程序,改用uni框架試試,簡單記錄下流程以及遇到的些問題。(記的東西有點雜,自用 ??看起來繁雜請見諒) (1)先全局安裝 npm install -g @vue/cli (只需要安裝一次,安裝過后就不用安裝了) PS : 直接npm install -g@vue/cli 安裝 可能會報錯

    2024年02月09日
    瀏覽(32)
  • uni-app開發(fā)微信小程序 web-view通訊

    uni-app開發(fā)微信小程序 web-view通訊

    最近開發(fā)了一個微信小程序嵌套vue頁面 vue頁面 有時候會使用到微信小程序的api 但是有的api他h5是不支持的 ?官方文檔中提供的兩種方法 @message 內(nèi)嵌的h5頁面不支持 Window的postMessage 在h5端使用沒啥問題,這該死的uni-app頁面不管怎么弄都會報那個window的錯? 還是我太菜了。。。

    2024年02月19日
    瀏覽(89)
  • uni-app開發(fā)微信小程序 vue3寫法添加pinia

    uni-app開發(fā)微信小程序 vue3寫法添加pinia

    使用uni-app開發(fā),選擇vue3語法,開發(fā)工具是HBliuderX。雖然內(nèi)置有vuex,但是個人還是喜歡用Pinia,所以就添加進(jìn)去了。 Pinia官網(wǎng)連接 第一步: 在項目根目錄下執(zhí)行命令: npm install pinia 第二步: 配置main.js文件 第三步,使用: 創(chuàng)建store文件夾、創(chuàng)建store/index.js 然后創(chuàng)建store/modu

    2024年02月03日
    瀏覽(28)
  • VUE(uni-app框架)開發(fā)微信小程序①-搭建腳手架

    VUE(uni-app框架)開發(fā)微信小程序①-搭建腳手架

    一,腳手架搭建 前提:搭建腳手架的前提是需要裝node.js,因為需要用到npm。 下載官網(wǎng):下載 | Node.js 中文網(wǎng) (nodejs.cn) 根據(jù)自己需要下載一個適合自己的版本,然后點擊安裝,安裝完成后在命令提示窗口輸入 node -v如果有版本信息就說明安裝成功了 ?接下來: 1.全局安裝: np

    2024年02月11日
    瀏覽(28)
  • 如何用uni-app+vue3+vant開發(fā)微信小程序

    如何用uni-app+vue3+vant開發(fā)微信小程序

    uni-app之前一直只支持vue2語法, 2021年8月:新版支持 了vue3 開發(fā),App平臺編譯器升級為 Vite; 新版 uni-app 框架主要做了三大改進(jìn): 重寫框架內(nèi)核:基于 vue3 + ts 重寫內(nèi)置組件和API,實現(xiàn)更徹底、更高效的 tree-shaking ; 新增支持 Vite 構(gòu)建工具,在H5平臺實現(xiàn)秒開預(yù)覽; 新增支持

    2024年02月09日
    瀏覽(21)
  • uni-app使用HBuilder X工具和微信小程序工具開發(fā)微信小程序

    uni-app使用HBuilder X工具和微信小程序工具開發(fā)微信小程序

    選擇uni-app的原因是什么 需要使用到的工具 關(guān)于HBuilder X工具和微信小程序工具的介紹 ?怎么下載HBuilder X工具和微信小程序工具? 如何使用HBuilderX工具 如何使用微信小程序工具 ?結(jié)尾 什么是uni-app uni-app是一個使用vue.js開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼,可發(fā)布到

    2024年02月08日
    瀏覽(99)
  • uni-app開發(fā)微信小程序真機調(diào)試請求超時&請求被拒絕

    uni-app開發(fā)微信小程序真機調(diào)試請求超時&請求被拒絕

    uni-app開發(fā)微信小程序真機調(diào)試請求超時請求被拒絕 在利用uni-app開發(fā)小程序時,寫好的程序利用微信的模擬器進(jìn)行調(diào)試時一切正常,但是一旦啟用真機調(diào)試就會出現(xiàn)請求超時或者請求被拒絕的問題。如下圖: 請求超時: errMsg: “request:fail fail:time out” errMsg: “request:fail -118:

    2024年02月12日
    瀏覽(36)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包