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

  • excel怎么截图选中区域(excel怎么截图选中区域保存到桌面)

    excel怎么截图选中区域(excel怎么截图选中区域保存到桌面)

  • 微信激活收不到验证码是为什么(微信激活账号总是显示未收到短信)

    微信激活收不到验证码是为什么(微信激活账号总是显示未收到短信)

  • 笔记本电脑按f11退不了全屏(笔记本电脑按f11屏幕变黑了)

    笔记本电脑按f11退不了全屏(笔记本电脑按f11屏幕变黑了)

  • 华为p30pro如何插耳机(华为p30 pro怎么连接u盘)

    华为p30pro如何插耳机(华为p30 pro怎么连接u盘)

  • freebuds3用什么充电头(freebuds3充电用什么充电头)

    freebuds3用什么充电头(freebuds3充电用什么充电头)

  • 幻音音乐被下架原因(幻音音乐被和谐了)

    幻音音乐被下架原因(幻音音乐被和谐了)

  • 看不到朋友圈背景图是被拉黑了吗(看不到朋友圈背景墙是什么意思)

    看不到朋友圈背景图是被拉黑了吗(看不到朋友圈背景墙是什么意思)

  • 小米10无法连接蓝牙(小米10无法连接电脑)

    小米10无法连接蓝牙(小米10无法连接电脑)

  • 小米2016050是什么型号(小米2016051是什么手机)

    小米2016050是什么型号(小米2016051是什么手机)

  • wifi变卡了是什么原因(wifi很卡是因为什么)

    wifi变卡了是什么原因(wifi很卡是因为什么)

  • 5ipro与5z区别(5gcpepro和5gcpepro2)

    5ipro与5z区别(5gcpepro和5gcpepro2)

  • 电脑网络被禁用了怎么打开(电脑无法连接wifi网络是怎么回事)

    电脑网络被禁用了怎么打开(电脑无法连接wifi网络是怎么回事)

  • 苹果11原装配件有哪些(苹果11原装配件多少钱)

    苹果11原装配件有哪些(苹果11原装配件多少钱)

  • 计算机软件系统是由哪两部分组成(计算机软件系统一般分为哪两部分)

    计算机软件系统是由哪两部分组成(计算机软件系统一般分为哪两部分)

  • 无限大功率电源的特点是什么(无限大功率电源指的是)

    无限大功率电源的特点是什么(无限大功率电源指的是)

  • 怎么查看苹果手机wifi密码显示(怎么查看苹果手机连接的wifi密码)

    怎么查看苹果手机wifi密码显示(怎么查看苹果手机连接的wifi密码)

  • 低流量模式是怎么回事(低流量数据模式)

    低流量模式是怎么回事(低流量数据模式)

  • 应用未安装怎么解决(应用未安装怎么设置)

    应用未安装怎么解决(应用未安装怎么设置)

  • 微信收藏悬浮窗怎么弄(微信收藏浮窗功能怎么关闭)

    微信收藏悬浮窗怎么弄(微信收藏浮窗功能怎么关闭)

  • 蓝牙耳机可以用快充吗(蓝牙耳机可以用快充充电吗)

    蓝牙耳机可以用快充吗(蓝牙耳机可以用快充充电吗)

  • 数据加密的基本功能(数据加密的基本过程就是对原来)

    数据加密的基本功能(数据加密的基本过程就是对原来)

  • 通过手机号可以查到身份证吗(通过手机号可以查快递吗)

    通过手机号可以查到身份证吗(通过手机号可以查快递吗)

  • Windows8误删开始屏幕桌面图标如何找回?(误删开始菜单)

    Windows8误删开始屏幕桌面图标如何找回?(误删开始菜单)

  • web前端面试高频考点——Vue3.x新增API(生命周期,ref、toRef 和 toRefs 的理解和最佳使用方式)(web前端面试基础知识)

    web前端面试高频考点——Vue3.x新增API(生命周期,ref、toRef 和 toRefs 的理解和最佳使用方式)(web前端面试基础知识)

  • 进口缴纳关税
  • 组成计税价格公式消费税
  • 研发设备定义
  • 外币账户单位基本情况表
  • 乙方收到甲方项目建设工程款如何记账
  • 金税盘业务
  • 个别计价法和先进先出法举例
  • 资产处置收益计入利润总额吗
  • 如何合理把公司的钱拿出来
  • 费用化支出期末结转
  • 支付佣金和手续费一样吗
  • 出纳现金日记账表格模板
  • 存货周转次数变高的可能原因是
  • 取得消费税出口退税款如何做会计处理?
  • 个人房产税怎么计算
  • 营改增后部分经济行为定性上的变化和影响有什么?
  • 外商投资企业外债额度
  • 净资产怎么算的 视频
  • 用于在建工程的固定资产是否可以计提折旧
  • 广告费超标今年怎么处理
  • 供应商是收款人还是付款人
  • win7为什么现在不能用了
  • android 设置按钮颜色
  • 公司预交一年的养老保险
  • php ini
  • 盈余 盈利
  • 销售产品取得收入4500万元
  • php数组函数输出《咏雪》里有多少"片"字
  • backup是什么文件夹怎么能打开
  • PHP:iconv_mime_decode()的用法_iconv函数
  • 没报关的货物还需要开发票嘛
  • joomla中文手册
  • 外贸公司主要是做什么产品
  • msg文件怎么创建
  • 从银行提取现金50000元备发工资
  • 生产企业出口退税政策
  • 兼职费用怎么入账报销
  • 员工工资计提
  • SQLite教程(十):内存数据库和临时数据库
  • SQL Server 2008 R2 超详细安装图文教程
  • mysql 执行过程
  • 路桥费税率是几个点
  • 企业收到投资者投入资金
  • 一般纳税人企业所得税税率多少
  • 报销粘贴单怎么粘贴发票
  • 存货周转率特别高说明什么
  • 税费滞纳金计入营业外支出吗
  • 进项抵扣和销项抵扣
  • 股权转让如何进行资产评估的
  • 购入库存商品会计摘要怎么写
  • 公户的利息收入账务处理咋处理
  • 金税盘可以用热点吗
  • 电子发票一定要盖章吗
  • 发票金额小于实付金额会计分录
  • 红十字会是事业编还是行政编
  • 银行存款日记账对方科目两个怎么办
  • 私营公司待摊费怎么算
  • 工业企业增值税负率一般控制在多少
  • 工业企业营业税率
  • 账务处理程序和财务处理程序
  • zmweb.exe是什么进程
  • windowsserver2008r2激活密钥
  • 重装win7旗舰版系统教程
  • centos 7.2安装
  • 如何设置无线网密码
  • xp系统里的打印机怎么设置的和新7
  • Ubuntu系统怎么设置IP
  • kcleaner是什么文件夹
  • windows10 2021预览版
  • win10打开资源管理器很慢
  • UnityEditor.UI.dll' is in timestamps but is not known in assetdatabase
  • linux的open
  • 批处理/l
  • 深入理解计算机系统
  • jquery search
  • android实战项目实例
  • 判断jquery对象是否存在
  • 税务登记注销证明是什么样的
  • 消费税的纳税义务的发生时间是如何规定的
  • 金税三期可以申报个税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设