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

  • iqoo8防屏闪怎么开(iqoo8低亮度防屏闪)

    iqoo8防屏闪怎么开(iqoo8低亮度防屏闪)

  • 钉钉怎么在电脑上登录(钉钉怎么在电脑上登录两个账号)

    钉钉怎么在电脑上登录(钉钉怎么在电脑上登录两个账号)

  • qq音乐怎么调音效(qq音乐怎么调音乐品质)

    qq音乐怎么调音效(qq音乐怎么调音乐品质)

  • 华为ax3路由器怎么设置(华为ax3路由器怎么设置2.4g)

    华为ax3路由器怎么设置(华为ax3路由器怎么设置2.4g)

  • 小米10长宽高的尺寸是多少(小米10长宽厚)

    小米10长宽高的尺寸是多少(小米10长宽厚)

  • oppok5是不是5g手机(oppok5支不支持5g)

    oppok5是不是5g手机(oppok5支不支持5g)

  • 无法找到输入设备(无法找到输入设备是什么意思)

    无法找到输入设备(无法找到输入设备是什么意思)

  • 宽带连接已拒绝远程连接因为未识别(宽带连接已拒绝远程连接因为未识别win11)

    宽带连接已拒绝远程连接因为未识别(宽带连接已拒绝远程连接因为未识别win11)

  • mate30耳机接触不好(mate30耳机接触不良怎么办)

    mate30耳机接触不好(mate30耳机接触不良怎么办)

  • b站下载的视频怎么保存到电脑(b站下载的视频只有33秒怎么解决)

    b站下载的视频怎么保存到电脑(b站下载的视频只有33秒怎么解决)

  • 苹果x抖音怎么看好友在不在线(苹果X抖音怎么投屏到电视上)

    苹果x抖音怎么看好友在不在线(苹果X抖音怎么投屏到电视上)

  • 下了订单怎么退大王卡(下单后怎么退单)

    下了订单怎么退大王卡(下单后怎么退单)

  • 苹果6s plus内存不够用怎么办(苹果6s plus内存16可以扩展吗?)

    苹果6s plus内存不够用怎么办(苹果6s plus内存16可以扩展吗?)

  • 苹果8p喇叭声音越来越小(苹果8p喇叭声音小怎么解决方法)

    苹果8p喇叭声音越来越小(苹果8p喇叭声音小怎么解决方法)

  • 短信变不回imessage(短信不回复是不是屏蔽了)

    短信变不回imessage(短信不回复是不是屏蔽了)

  • 打印东西怎么横着打印(打印东西怎么横版)

    打印东西怎么横着打印(打印东西怎么横版)

  • 华为畅享10s充电多久(华为畅享10s充电功率)

    华为畅享10s充电多久(华为畅享10s充电功率)

  • word怎么画线条(word怎么画线条写字)

    word怎么画线条(word怎么画线条写字)

  • 虎牙无法登录(虎牙无法登录怎么回事)

    虎牙无法登录(虎牙无法登录怎么回事)

  • 300兆光纤用什么网线(300兆光纤用什么无线网卡)

    300兆光纤用什么网线(300兆光纤用什么无线网卡)

  • 苹果手机怎么创建文件夹(苹果手机怎么创建apple ID)

    苹果手机怎么创建文件夹(苹果手机怎么创建apple ID)

  • 手机保修什么意思(手机保修包括什么东西)

    手机保修什么意思(手机保修包括什么东西)

  • 怎么用excel求乘(怎样在excel表求乘)

    怎么用excel求乘(怎样在excel表求乘)

  • 微信退群怎么还有消息(微信退群了群里还有你的信息吗)

    微信退群怎么还有消息(微信退群了群里还有你的信息吗)

  • 小米5怎么分屏多窗口(小米5怎么分屏玩游戏)

    小米5怎么分屏多窗口(小米5怎么分屏玩游戏)

  • airpods要一直开蓝牙吗(airpods需要开关机吗)

    airpods要一直开蓝牙吗(airpods需要开关机吗)

  • qq怎么删自动回复(qq怎么删自动回复?)

    qq怎么删自动回复(qq怎么删自动回复?)

  • 前一年度进项税少记了怎么办
  • 什么是关税自主权
  • 取得的高速公路发票可以抵扣吗
  • 发行股票支付给承销商的发行费用计入
  • 法人拿走公司利润要交税吗
  • 即征即退进项税额为哪些
  • 为什么征收增值税体现了量益原则
  • 小规模附加税减半吗
  • 不得抵扣的进项税额转出会计分录
  • 实收资本如何网上转账
  • 红字信息表可以开一半吗
  • 赔偿款能否税前抵扣
  • 财务人士必知消防知识
  • 普通发票可以改明细吗
  • 代扣代缴手续费返还需要缴纳增值税吗
  • 代收房款
  • 个人去税务局开居间费发票
  • 收到子公司分红需要交所得税吗?
  • 营改增后房产税计入什么科目
  • 跨行发报
  • 办公室和电梯电梯哪个好
  • 关于有什么新的政策
  • 文化事业建设费征收对象
  • 企业为员工购买团体医疗险可以全额税前扣除
  • 企业电子印章申请流程海口
  • 自建自用建筑物,其自建行为不是建筑业税目的征税范围
  • 开通电子税务局需要什么资料
  • 买车预付款怎么记账
  • 固定资产改造更新是否需要计提折旧
  • 销售商品结转成本会计分录
  • win10玩游戏太卡了
  • windows11怎么回到桌面
  • 华为鸿蒙系统开发平台
  • 企业生产过程中的一个安全问题必须
  • 糖尿病患者在什么情况下无需
  • wordpress导入主题教程
  • 阻止电脑系统更新设置在哪
  • 外资企业出租房产税优惠
  • 托收账款属于什么会计科目
  • 待报解预算收入什么意思
  • php延迟静态绑定
  • 其他综合收益什么类科目
  • 电话费发放标准2020
  • 领用包装物会计处理
  • 期初成本和期末成本
  • 基本户不注销会扣钱吗
  • 其他应收款怎么冲平会计分录
  • 报销人和收款人不一致钱打到哪个账户
  • MySQL: mysql is not running but lock exists 的解决方法
  • mysql触发器使用
  • 调研费属于什么会计科目
  • 商铺固定设施指哪些
  • 6月工资7月发8月申报
  • 怎么打印税务登记证明备案表
  • 以前年度损益调整
  • 政府给企业的奖励能给个人吗
  • 开具的增值税专用发票上注明的价款含税吗
  • 政府补贴递延收益的摊销时间
  • 营业执照过期多久不能审
  • 工业企业应付会计工作内容
  • vmware虚拟机怎么克隆
  • ubuntu16.04开启远程桌面
  • windrv.exe
  • wbs是什么文件
  • winproxy.exe - winproxy是什么进程
  • win7检测有错误怎么办
  • win10周年更新版是什么意思
  • xp注册表文件在哪
  • 如何把旧mac上的所有内容迁移到新mac上
  • win7系统宽带连接错误651
  • windows8更新不了怎么办
  • win10外置光驱读不出光盘怎么办
  • 用球体模拟天空的游戏
  • js如何获取url
  • nodejs word
  • 安卓系统引导程序
  • jquery弹窗弹出一个页面
  • android studio常用控件
  • 麻将 空白
  • 山东地域分布
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设