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

  • 手机钉钉怎么换视频会议背景(手机钉钉怎么换行打字)

    手机钉钉怎么换视频会议背景(手机钉钉怎么换行打字)

  • 如何查看主板型号(如何查看主板型号 intel 200以上)

    如何查看主板型号(如何查看主板型号 intel 200以上)

  • 苹果11如何分屏多窗口(苹果11如何分屏微信)

    苹果11如何分屏多窗口(苹果11如何分屏微信)

  • 微信的自动回复怎样设置(微信的自动回复在哪里设置)

    微信的自动回复怎样设置(微信的自动回复在哪里设置)

  • 支付宝没实名认证可以收钱吗(支付宝没实名认证别人转账过来会退回去吗)

    支付宝没实名认证可以收钱吗(支付宝没实名认证别人转账过来会退回去吗)

  • 微信拉入黑名单后聊天记录还在么(微信拉入黑名单的人怎么拉出来)

    微信拉入黑名单后聊天记录还在么(微信拉入黑名单的人怎么拉出来)

  • 路由器有使用年限吗(路由器使用年限是几年)

    路由器有使用年限吗(路由器使用年限是几年)

  • magicwatch2和gt2区别(magicwatch2和gt2pro)

    magicwatch2和gt2区别(magicwatch2和gt2pro)

  • 没有黄钻怎么看被挡访客(没有黄钻怎么看访客记录)

    没有黄钻怎么看被挡访客(没有黄钻怎么看访客记录)

  • qq注册手机号有风险怎么办(qq注册手机号有危险吗)

    qq注册手机号有风险怎么办(qq注册手机号有危险吗)

  • soul被禁止私聊原因(soul被禁止私聊,还能评论吗)

    soul被禁止私聊原因(soul被禁止私聊,还能评论吗)

  • 登录qq时需要密保手机验证码怎么办(登录qq必须要密保手机号码吗)

    登录qq时需要密保手机验证码怎么办(登录qq必须要密保手机号码吗)

  • 快手的亲密值是怎么升的(快手的亲密值是怎么算的)

    快手的亲密值是怎么升的(快手的亲密值是怎么算的)

  • 微信可以用面部支付吗(微信用面部解锁)

    微信可以用面部支付吗(微信用面部解锁)

  • 计算机在人工智能方面的典型应用(计算机在人工智能方面的应用论文)

    计算机在人工智能方面的典型应用(计算机在人工智能方面的应用论文)

  • 怎么在淘宝上找到商家的电话(怎么在淘宝上找自己的地址)

    怎么在淘宝上找到商家的电话(怎么在淘宝上找自己的地址)

  • 手机如何禁止下载软件(手机如何禁止下载王者荣耀)

    手机如何禁止下载软件(手机如何禁止下载王者荣耀)

  • 小米无线车充支持哪些手机(小米无线车充支持苹果xr吗)

    小米无线车充支持哪些手机(小米无线车充支持苹果xr吗)

  • iphone11pro max颜色怎么选(iphone11pro max颜色对比)

    iphone11pro max颜色怎么选(iphone11pro max颜色对比)

  • 大量手机照片怎么保存(大量手机照片怎么保存在u盘里)

    大量手机照片怎么保存(大量手机照片怎么保存在u盘里)

  • cad缩放到参照物尺寸(cad缩放到参照物尺寸缩放快捷键)

    cad缩放到参照物尺寸(cad缩放到参照物尺寸缩放快捷键)

  • 鸿蒙系统支持第三方手机吗?(鸿蒙系统支持第三方相机吗)

    鸿蒙系统支持第三方手机吗?(鸿蒙系统支持第三方相机吗)

  • Net2FTP搭建免费web文件管理器『打造个人网盘』(.net tpl)

    Net2FTP搭建免费web文件管理器『打造个人网盘』(.net tpl)

  • 代开专用发票需要交城建税吗
  • 公司货款退款怎么写
  • 工商年报纳税总额怎么算
  • 税务发票上的二维码
  • 汇算清缴中研发费用中其他费用可抵扣的比例是多少
  • 承包经营承包费增值税
  • 营业成本利润率是指
  • 如何减少资产负债表上的资本公积
  • 房地产建造运费怎么计算
  • 教育经费税前扣除标准
  • 在不同单位拿的工资怎么计税?
  • 车辆保险费的车船税计入什么会计科目
  • 营改增后企业所得税不能跨年
  • 文化事业建设费的征收范围
  • 金税三期定期定额是什么
  • 设备租赁成本会计分录
  • 初级备考需要多长时间
  • 影响固定资产折旧的有
  • 其他税收收入包括
  • 资源税改革最新政策
  • 给子公司员工发放奖金合法吗
  • 合伙企业合伙人工资的账务处理
  • php adodb
  • 公司债务转个人债务
  • 酒店开业请吃饭敬酒怎么说
  • PHP:session_cache_limiter()的用法_Session函数
  • pddpic是什么文件
  • 分期摊销法计算公式
  • PHP:pg_close()的用法_PostgreSQL函数
  • 设置浏览器显示网络异常
  • 灰狼算法的改进
  • vue process.env.node_env
  • php屏蔽错误
  • 补缴房产税和土地使用税会计分录
  • 法人从公账上取款会计分录
  • 快递行业规矩
  • javascript速成要多久
  • 智能优化算法主要内容
  • php运行linux命令
  • 职工教育经费是否可以抵扣进项税
  • pgrep命令作用及含义
  • 公允价值变动损益借贷方向
  • 下列纳税人不得适用核定征收企业所得税的有
  • 安全文明措施费比例
  • 债权收益权转让
  • 总公司接活让分公司去做可以吗
  • 房产税的计算器
  • 个体户需要
  • 小规模公司注销时账务要如何处理
  • sql语句自动执行
  • 公户的结算卡是否可以转账
  • 小规模纳税人申报纳税详细流程
  • 开具发票后,如发生销售退回,通常有的两种处理方式是?
  • 制造费用工资计入什么科目
  • 房屋租赁费可以加计扣除吗
  • 2018年小规模纳税人
  • 收到现金怎么记账凭证
  • 公司为员工购买小汽车属于什么所得
  • 固定资产的后续支出应如何进行会计处理
  • 会计准则规定了什么
  • 管理费用通俗理解
  • 金蝶专业版怎么反过账
  • 企业注销预付账款怎么做
  • 会计核算方法包括
  • 用心一也的一是什么词类活用
  • unix系统复制命令
  • ubuntu系统中文
  • win10无法安装telnet
  • svcproc.exe - svcproc是什么进程 有什么作用
  • 开机密码怎么删除
  • 查看linux系统日志命令
  • win8丢失msvcp140.dll的解决办法
  • opengl颜色混合模式
  • node.js操作文件
  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
  • js按下回车键时提交
  • android获取屏幕大小
  • 个人所得税完税证明网上打印
  • 水费不用交吗
  • 农副产品营业执照范本
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设