位置: 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标签作用)

  • 小天才电话手表怎么插卡(小天才电话手表丢了关机怎么找回)

    小天才电话手表怎么插卡(小天才电话手表丢了关机怎么找回)

  • 微信怎么小窗私聊(微信小窗私聊怎么设置)

    微信怎么小窗私聊(微信小窗私聊怎么设置)

  • 滴滴可用余额和账户余额不一致(滴滴的余额和可用余额)

    滴滴可用余额和账户余额不一致(滴滴的余额和可用余额)

  • word空格键变成了点怎么办(word空格键变成横线了)

    word空格键变成了点怎么办(word空格键变成横线了)

  • pe系统进去了但是黑屏(pe系统进去了但无法开机)

    pe系统进去了但是黑屏(pe系统进去了但无法开机)

  • 隔空投送打不开(隔空投送打不开所有人)

    隔空投送打不开(隔空投送打不开所有人)

  • b站会员几个人同时登录(b站会员几个人用)

    b站会员几个人同时登录(b站会员几个人用)

  • 苹果怎么切换白天模式(苹果怎么切换白色模式)

    苹果怎么切换白天模式(苹果怎么切换白色模式)

  • 苹果watch怎么换id账号(苹果watch怎么换屏保)

    苹果watch怎么换id账号(苹果watch怎么换屏保)

  • 苹果11闪电接口检测到液体怎么办(苹果11闪电接口坏了换一个要多少钱)

    苹果11闪电接口检测到液体怎么办(苹果11闪电接口坏了换一个要多少钱)

  • 抖音阅读量为0是怎么回事(抖音阅读量为0什么意思)

    抖音阅读量为0是怎么回事(抖音阅读量为0什么意思)

  • iphonexsmax怎么截图屏幕(iphonexsmax怎么截长图片)

    iphonexsmax怎么截图屏幕(iphonexsmax怎么截长图片)

  • 手机摔了一下有影响吗(手机摔了一下有黑块怎么办)

    手机摔了一下有影响吗(手机摔了一下有黑块怎么办)

  • 微信声音突然变小怎么回事(微信声音突然变大怎么回事)

    微信声音突然变小怎么回事(微信声音突然变大怎么回事)

  • 微信账单怎么清空(微信账单怎么清理掉)

    微信账单怎么清空(微信账单怎么清理掉)

  • iphone8长宽高多少cm(苹果8长宽尺寸)

    iphone8长宽高多少cm(苹果8长宽尺寸)

  • xsmax无线充电几瓦(xs max 无线充电)

    xsmax无线充电几瓦(xs max 无线充电)

  • 苹果x小圆点找不到(苹果x手机小圆点)

    苹果x小圆点找不到(苹果x手机小圆点)

  • 华为软件哪些可以卸载(华为软件哪些可以删除)

    华为软件哪些可以卸载(华为软件哪些可以删除)

  • 蓝牙耳机的使用方法及步骤(蓝牙耳机的使用范围是多少)

    蓝牙耳机的使用方法及步骤(蓝牙耳机的使用范围是多少)

  • 苹果x可以反向充电吗(苹果x反向充电在哪)

    苹果x可以反向充电吗(苹果x反向充电在哪)

  • QQ怎么拒接别人的消息(qq怎么拒绝别人来电)

    QQ怎么拒接别人的消息(qq怎么拒绝别人来电)

  • 如何快速应对超星网课?(如何快速应对超载行为)

    如何快速应对超星网课?(如何快速应对超载行为)

  • 魅族16s什么时候上市(魅族16s什么时候停产的)

    魅族16s什么时候上市(魅族16s什么时候停产的)

  • 苹果手机怎么下载两个qq(苹果手机怎么下微信分身)

    苹果手机怎么下载两个qq(苹果手机怎么下微信分身)

  • GHOST不认硬盘或系统安装一半不能安装了该怎么办?(ghost读不出硬盘)

    GHOST不认硬盘或系统安装一半不能安装了该怎么办?(ghost读不出硬盘)

  • 一个注解搞定接口数据脱敏,太强了!(注解注入)

    一个注解搞定接口数据脱敏,太强了!(注解注入)

  • 医院收费单能当凭证用吗
  • 出差车费报销申请怎么写
  • 应付账款坏账准备的会计分录
  • 银行贷款利息支出汇算清缴需要调整吗
  • 免征政府性基金预缴税款
  • 厂房出租税收分类
  • 分公司转总公司款分录
  • 贴现的利息能不能取出来
  • 政府补贴可以税前扣除填写在哪里
  • 印花税股权转让计税依据
  • 核定征收的企业需要汇算清缴吗
  • 国家税务总局11号令
  • 高新技术企业资助
  • 个税申报方式可以修改去年的吗
  • 车船税为什么没有优惠
  • 购买用于产品设计拍摄的道具怎么做账?
  • 预缴所得税多交了汇算时可以抵扣下一年的所得税吗
  • 采用支票结算方式的基本业务处理程序
  • 进口货物如何缴增值税
  • 会计帐务处理程序
  • 应收账款余额包括预收账款
  • 公司章程签署
  • thinkphp添加数据
  • php parse_url
  • 现在我们来看看windows中的新增内容
  • 去年未计提费用,今年付怎么做账
  • 企业自行搬迁需要交税吗
  • PHP:mcrypt_cfb()的用法_Mcrypt函数
  • 没进项可以开专票吗
  • 前端布局flex
  • php去除字符串中的引号
  • 跨年度退货的账务处理
  • 出差餐补如何做账
  • 网页设置怎么在css中设置
  • 语音语言
  • 删除ont命令
  • mac datagrip
  • python怎么将整数转化为字符串
  • 公账转给员工工资
  • 基本户发工资的规定
  • 预收账款未发货会计分录
  • 增值税进项税额在借方还是贷方
  • sqlsever修改数据
  • 税收分类口诀
  • 小规模增值税为负数怎么报税
  • 资本公积的账务处理例题
  • 收到专利权投资的票据
  • 技术服务费如何赋码
  • 债券发行后在市场上交易时是怎么确定交易价格的
  • 企业改制后如何脱离原主管部门
  • 新手学会计怎么学
  • 记账凭证的审核与编制可以是一个人吗
  • 使用sql查询
  • Windows 9 Storage Sense储存功能更多图像
  • win8.1操作系统关闭驱动数字签名
  • unetbootin教程
  • mac os固件下载
  • mcdlc.exe - mcdlc是什么进程文件 有何作用
  • ssh密钥根据什么生成
  • windows磁盘工具
  • win10系统附件游戏被删除
  • linux使用命令查看ip地址
  • 激情台球游戏源码大全
  • android ui绘制
  • [置顶]JM259194
  • r语言和python画图
  • ecmascript5
  • python 效率优化
  • 安卓机怎么直播
  • JS+CSS实现仿雅虎另类滑动门切换效果
  • 安卓 自动更新
  • 示例代码
  • python 命令
  • 广州市税务局长
  • 企业破产享有的债权可否提前到期
  • 水电费的增值税专用税可抵扣进项
  • 中华人民共和国成立于1949年10月1日到今年是多少周年
  • 衰竭期矿山开采的矿产品减征幅度
  • 银行扣账户维护费会计分录
  • 为什么专利转让要交税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设