位置: IT常识 - 正文

uni-app开发微信小程序,H5 关于压缩上传图片的问题(uniapp开发微信小程序怎么样)

编辑:rootadmin
uni-app开发微信小程序,H5 关于压缩上传图片的问题

文章目录

前言

一、为什么要压缩图片

二、图片压缩方式

1. 微信小程序​​​​​​​

2. H5

总结

前言

推荐整理分享uni-app开发微信小程序,H5 关于压缩上传图片的问题(uniapp开发微信小程序怎么样),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:uni-app开发微信小游戏,uniapp开发微信小游戏,uni-app开发微信小游戏,uni-app开发微信小游戏,Uniapp开发微信小程序,uni-app开发微信小游戏,uniapp开发微信小程序怎么样,uni-app开发微信小游戏,内容如对您有帮助,希望把文章链接给更多的朋友!

关于微信小程序、H5兼容性问题,今天就压缩以及上传图片做一个可实现方法的简要阐述。

一、为什么要压缩图片​​​​​​​

在使用uni-app开发小程序及H5的具体业务中,我们会遇到需要让用户上传本地图片的场景,随着现在的手机像素越来越高,图片的大小也越来越大,上传原图后一方面是难以上传成功,另一方面是上传成功后在列表中图片太大加载时间过长或者加载失败。若是直接提示用户 “无法上传xxM以上的图片” ,用户体验会不好,于是需要我们对用户上传的图片进行压缩。而不同平台之间压缩图片的方式并不完全兼容,需要提供不同的方法来实现。本文主要记录了在不同平台实现图片压缩上传的其中一种可实现方法。

二、图片压缩方式

uni-app官方提供了关于图片的一系列内置API

首先从选择图片开始

uni.chooseImage(OBJECT)      从本地相册选择图片或使用相机拍照。

// 该方法兼容小程序、H5uni.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-app开发微信小程序,H5 关于压缩上传图片的问题(uniapp开发微信小程序怎么样)

uni.compressImage(OBJECT)     压缩图片接口,可选压缩质量。

// 该方法兼容app和小程序,不兼容h5,且仅对jpg格式有效uni.compressImage({ src: src, // 图片路径quality: 10, // 图片压缩质量,0~100,默认80,仅对jpg有效success: res => { console.log(res.tempFilePath,'压缩后的图片路径') // 接下来可以在这里处理图片上传}})

实现图片上传

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

readFile()     读取文件,可转换编码格式

// 该方法不兼容h5uni.getFileSystemManager().readFile({filePath: path, // 要读取的文件路径encoding: 'base64', // 编码格式success: file => { wx_uploadImage({ // 调用接口实现上传图片,使用其他方式也可以 image: `data:image/png;base64,${file.data}` }).then(res => { console.log('上传图片成功', res) this.image = res.storage_path // 赋值或者其他操作 })}})2. H5

H5需要使用另外的方式来压缩图片,这里用到了canvas。

- 分三步 -

1. 使用canvas限制图片大小(压缩图片),并转换为"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'); // 这里根据要求限制图片宽高 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()方法创造Blob对象,用以展示canvas上的图片 canvas.toBlob(function(fileSrc) { let imgSrc = window.URL.createObjectURL(fileSrc); console.log('压缩后的blob路径', imgSrc); }); }});

2. 将 "blob路径" 转换为 "blob文件"(待会转换base64格式图片需要用到 "blob文件" 的格式)

// 传入blob路径,.then()获取blob文件httpRequest(src) { let that = thisreturn 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文件" 转换为 base64格式的图片,最后上传图片。

const fileReader = new FileReader()fileReader.readAsDataURL(file) // 读取blob类型的图像文件(不是blob路径),读取成功触发onload方法,并得到result(base64格式的图片)fileReader.onload = (event) => { console.log(fileReader.result,'fileReader.result - base64格式'); if (fileReader.result) { // 调用wx_uploadImage接口,图片大小必须是1M以下,否则报错 wx_uploadImage({ image: fileReader.result }).then(res => { console.log('上传图片成功', res) this.image = res.storage_path }) }}总结

总结一下以上逻辑经过封装后的完整代码:

// 使用条件编译区分微信小程序、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,'图片文件'); // 先压缩,再转换为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, // 图片压缩质量,0~100,默认80,仅对jpg有效success: res => { console.log(res.tempFilePath,'压缩后的图片路径') // 接下来可以在这里处理图片上传 _this.mp_filetobase64(res.tempFilePath)} })}// 微信小程序 - 'blob路径'转base64图片的方法mp_filetobase64(path) { // 该方法不兼容h5 uni.getFileSystemManager().readFile({filePath: path, // 要读取的文件路径encoding: 'base64', // 编码格式success: file => { wx_uploadImage({ // 调用接口实现上传图片,使用其他方式也可以 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'); // 这里根据要求限制图片宽高 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()方法创造Blob对象,用以展示canvas上的图片 canvas.toBlob(function(fileSrc) { let imgSrc = window.URL.createObjectURL(fileSrc); console.log('压缩后的blob路径', imgSrc); // 调用httpRequest方法,把bloburl转换成blob文件_this.httpRequest(imgSrc).then(res => { console.log(res,'成功转换为blob文件'); _this.h5_filetobase64(res); // 调用方法,把blob文件转换成base64图片}) }); } });}// 传入blob路径,.then()获取blob文件httpRequest(src) { let that = thisreturn 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文件'转base64图片的方法h5_filetobase64(file) { const fileReader = new FileReader() fileReader.readAsDataURL(file) // 读取blob类型的图像文件(不是blob路径),读取成功触发onload方法,并得到result(base64格式的图片) fileReader.onload = (event) => { console.log(fileReader.result,'fileReader.result - base64格式'); if (fileReader.result) { // 调用wx_uploadImage接口,图片大小必须是1M以下,否则报错 wx_uploadImage({ image: fileReader.result }).then(res => { console.log('上传图片成功', res) this.image = res.storage_path }) } }}
本文链接地址:https://www.jiuchutong.com/zhishi/299948.html 转载请保留说明!

上一篇:人工智能练习题 + 知识点汇总(期末复习版)(人工智能答案)

下一篇:HTML <span>标签(html span标签作用)

  • 联想小新15键盘灯怎么开(联想小新15键盘背光灯怎么开)

    联想小新15键盘灯怎么开(联想小新15键盘背光灯怎么开)

  • opporeno7是不是双卡(oppor7是双4g吗)

    opporeno7是不是双卡(oppor7是双4g吗)

  • 华为美团如何关闭自动扣款(美团怎么关闭外卖)

    华为美团如何关闭自动扣款(美团怎么关闭外卖)

  • 新手机一般充电几个小时最合适(新手机一般充电能用多长时间)

    新手机一般充电几个小时最合适(新手机一般充电能用多长时间)

  • 拼多多手机号登录和微信登录一样吗(拼多多手机号登录的手机号不用了怎样查询订单)

    拼多多手机号登录和微信登录一样吗(拼多多手机号登录的手机号不用了怎样查询订单)

  • 网易云音乐会员到期后下载的歌还能听吗(网易云音乐会员免费领)

    网易云音乐会员到期后下载的歌还能听吗(网易云音乐会员免费领)

  • 手机屏幕不显示了怎么回事(手机屏幕不显示时间和日期怎么办)

    手机屏幕不显示了怎么回事(手机屏幕不显示时间和日期怎么办)

  • 手机电池鼓起来的原因(手机电池鼓起来了还能用吗)

    手机电池鼓起来的原因(手机电池鼓起来了还能用吗)

  • 微信语音自动挂断原因(微信语音自动挂断是多久)

    微信语音自动挂断原因(微信语音自动挂断是多久)

  • word文档怎么加入密码(word文档怎么加一页)

    word文档怎么加入密码(word文档怎么加一页)

  • 淘宝在哪拒绝签收(淘宝拒签怎么拒签)

    淘宝在哪拒绝签收(淘宝拒签怎么拒签)

  • 苹果lla是什么版本有锁吗(lla是什么版本的苹果手机)

    苹果lla是什么版本有锁吗(lla是什么版本的苹果手机)

  • iphone录屏在哪里打开(iphone录屏在哪里设置)

    iphone录屏在哪里打开(iphone录屏在哪里设置)

  • vivo手机怎么把软件下载到内存卡上(vivo手机怎么把旧手机传到新手机)

    vivo手机怎么把软件下载到内存卡上(vivo手机怎么把旧手机传到新手机)

  • kindle为啥不送充电头(kindle 送书)

    kindle为啥不送充电头(kindle 送书)

  • 微信积分在哪里兑换(微信积分在哪里领)

    微信积分在哪里兑换(微信积分在哪里领)

  • 键盘灯一直闪烁不能用(键盘灯一直闪烁按键没反应)

    键盘灯一直闪烁不能用(键盘灯一直闪烁按键没反应)

  • 换手机qq登不上去咋办(换手机qq登不上怎么办以前的号都不用了)

    换手机qq登不上去咋办(换手机qq登不上怎么办以前的号都不用了)

  • vivoy93怎么关机开机(vivo y93怎么强制关机)

    vivoy93怎么关机开机(vivo y93怎么强制关机)

  • wps如何给文档加密(wps如何给文档加密码保护)

    wps如何给文档加密(wps如何给文档加密码保护)

  • 如何退出360软件(如何退出360软件管家)

    如何退出360软件(如何退出360软件管家)

  • 手机腾讯视频怎么保存本地(手机腾讯视频怎么微信扫码登录)

    手机腾讯视频怎么保存本地(手机腾讯视频怎么微信扫码登录)

  • 苹果怎么隐藏中国联通(苹果怎么隐藏中国移动四个字的信息)

    苹果怎么隐藏中国联通(苹果怎么隐藏中国移动四个字的信息)

  • vue3+ts项目里如何使用状态管理pinia以及数据持久化(vue ts)

    vue3+ts项目里如何使用状态管理pinia以及数据持久化(vue ts)

  • python Web开发 flask轻量级Web框架实战项目--实现功能--账号密码登录界面(连接数据库Mysql)(python web开发方向的第三方库有哪些)

    python Web开发 flask轻量级Web框架实战项目--实现功能--账号密码登录界面(连接数据库Mysql)(python web开发方向的第三方库有哪些)

  • python如何建立venv虚拟环境(python如何建立函数)

    python如何建立venv虚拟环境(python如何建立函数)

  • 补提企业所得税怎么做账
  • 金税四期有什么优势
  • 饭店发光板图片大全
  • 来料加工出口免税不退税
  • 管理费用福利费和应付职工薪酬福利费区别
  • 半成品算原材料吗
  • 资产重组账务处理 会计视野
  • 营改增后转让土地使用权增值税
  • 未计提坏账准备金额在哪个科目
  • 2018年2月1日以后出口发票如何开具
  • 印花税申报完成后如何缴款
  • 国地税联合财务报表小规模企业需要报送的吗?
  • 减税降费政策六税
  • 技术转让免征增值税
  • 视同销售收入和成本如何确认
  • 建筑工程甲方提供给乙方的材料
  • 要求做前两年的核酸检测
  • 报关单上的运费怎么看
  • 两处拿工资的缴税问题
  • 投资股权转让需要注意什么?
  • 鸿蒙密码锁设置密码的方法
  • 当期费用包括哪些科目
  • 转让无形资产的所有权计入什么科目
  • 简易征收增值税怎么算
  • 8款应用
  • 中秋福利发放现金文案怎么写
  • 两台电脑文件共享,显示没有访问权限
  • php目录操作
  • 奖金发放的原则
  • 广告宣传费的税收筹划
  • 报废汽车残值收入如何计税
  • 什么是webrip
  • 聊聊vue3的defineProps、defineEmits、defineExpose
  • php sha1加密 解密
  • 现金清查的会计分录
  • 工程项目出纳
  • web核心的三个标准
  • php接口开发详解
  • php知识点汇总与解答
  • php获取文件内容的方法
  • tcpreplay命令详解
  • 银行承兑汇票贴现分录
  • 什么是死锁,死锁的四个必要条件
  • 垫付应收款怎么做会计分录
  • 小规模印花税可以按次申报吗
  • 分公司是独立的诉讼主体吗
  • 劳务报酬包括哪些
  • 什么是ad域服务
  • mongodb 设置用户名密码
  • 一般纳税人季报怎么填
  • 负债类会计科目新增科目包括
  • 企业收到的财政性补贴要交企业所得税吗
  • 预缴的增值税在增值税附表四怎么填
  • 对公付货款没有收到发票如何处理
  • 跨月凭证出错如何调整
  • 汇率调节主要手段
  • 先进先出法实际成本跟成本不一样吗
  • 建账的过程包括哪些内容
  • mysql分表实践
  • ubuntu通讯软件
  • windows xp windows
  • centos7如何设置ssh免密登陆
  • page文档的排版技巧
  • 常用宏操作的参数设置方法
  • xbox无法连接无线网络
  • Win7自带的扫雷怎么都打不开
  • win8.1应用商店
  • win7旗舰版系统激活密钥
  • node搭建博客
  • 每天学一个成语
  • ai人工智能python
  • css模糊滤镜
  • nodejs发送post请求socket hand up
  • unity如何连接数据库
  • javascript基础入门视频教程
  • python3遍历字典
  • JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
  • jquery 3.5
  • 外贸企业出口退税流程及账务处理
  • 村级服务公开的具体内容
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设