试用场景:上传图片过大,需进行压缩处理。

涉及微信API

API 说明 文档
chooseImage 选择图片 https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.html
createCanvasContext 创建canvas画布 https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createCanvasContext.html
getImageInfo 获取图片信息 https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.getImageInfo.html
CanvasContext.drawImage() 绘制图像到画布 https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html
CanvasContext.draw() 绘制是否跟着上次绘制,即是否清空画板 https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.draw.html
canvasToTempFilePath 把当前画布导出指定大小的图片,即压缩图片 https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasToTempFilePath.html

wxml

    <!--不显示画板且正常获取生成的压缩图片-->
<canvas
style="width: {{canWidth}}px;height: {{canHeight}}px;visibility:hidden;z-index: -1px"
canvas-id="attendCanvasId"
class="pa tp-0 lf-0"/>
<view
bindtap='create'
style="background-color: {{themeColor}}"
class="dib pl-30 pr-30 ht-80 lh-80 bdr-100 white wi-100 tc fs-32">
上传图片
</view>

js

    data: {
// 接收选中的图片列表
files: [],
// 接收压缩后的图片
compressFiles: [],
// 预设画布宽高
canvasWidth: 0,
canvasHeight: 0
},
// 选择图片
chooseImage: function () {
var that = this;
wx.chooseImage({
count: 6, // 设置允许选择的图片个数
sizeType: ['compressed'], // 压缩图
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
// 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
that.setData({
files: that.data.files.concat(res.tempFilePaths)
})
}
})
},
// 绘图
drawCanvas: function () {
this.setData({
compressFiles: []
}, () => {
const ctx = wx.createCanvasContext('attendCanvasId')
let that = this
for (let i in this.data.files) {
let item = this.data.files[i]
wx.getImageInfo({
src: item,
success: function (res) {
if (res.width > 275 || res.height > 172) { // 判断图片超过一定像素侯进行压缩
// 获取原图比例
let scale = res.width / res.height
that.setData({
canvasWidth: 275,
canvasHeight: 275 / scale
})
// 画出压缩图片
ctx.drawImage(that.data.files, 0, 0, that.data.canvasWidth, that.data.canvasHeight)
ctx.draw()
// 等待压缩图片生成
that.prodImageOpt()
}
}
})
}
})
},
// 压缩图片
prodImageOpt: function () {
let that = this
wx.canvasToTempFilePath({
canvasId: 'attendCanvasId', // 画布id
fileType: 'jpg', // 压缩图片的格式
quality: 1, // 压缩图片的质量,进‘jpg’格式可用
success: function (res) {
let arr = that.data.compressFiles
arr.push(res.tempFilePath)
that.setData({
compressFiles: arr
})
// 查看文件压缩后的信息
// wx.getImageInfo({
// src: res.tempFilePath,
// success: function (res) {
// console.log(res)
// }
// })
}
})
},
// 上传图片
create: function () {
let arr = this.drawCanvas() // 提交表单时绘制画布并进行压缩
setTimeout(() => {
// 获取压缩后的图片路径
console.log(this.data.compressFiles)
}, 300)
// 请求函数
...
...
...
}

微信小程序文件压缩上传的更多相关文章

  1. 微信小程序 --- 文件的上传和下载

    文件上传 / 文件下载 : wx.uploadFile

  2. 微信小程序多张图片上传

    微信小程序上传图片每次只能上传一张,所有很多朋友就会问想要多张图片上传怎么办? 首先,我们来看一看wx.chooseImage(object)和wx.uploadFile(OBJECT)这两个个api ...

  3. [转]微信小程序实现图片上传功能

    本文转自:http://blog.csdn.net/feter1992/article/details/77877659 前端: 微信开发者工具 后端:.Net 服务器:阿里云 这里介绍微信小程序如何 ...

  4. nodeJs实现微信小程序的图片上传

    今天我来介绍一下nodejs如何实现保存微信小程序传过来的图片及其返回 首先wx.uploadFile绝大部分时候是配合wx.chooseImage一起出现的,毕竟选择好了图片,再统一上传是实现用户图 ...

  5. 微信小程序实现图片上传功能

    前端: 微信开发者工具 后端:.Net 服务器:阿里云 这里介绍微信小程序如何实现上传图片到自己的服务器上 前端代码 data: { productInfo: {} }, //添加Banner bin ...

  6. 微信小程序--实现图片上传

    前端: 微信开发者工具 后端:.Net 服务器:阿里云 这里介绍微信小程序如何实现上传图片到自己的服务器上 前端代码 data: { productInfo: {} }, //添加Banner bin ...

  7. 微信小程序中图片上传阿里云Oss

    本人今年6月份毕业,最近刚在上海一家小公司实习,做微信小程序开发.最近工作遇到一个小问题. 微信小程序图片上传阿里云服务器Oss也折腾了蛮久才解决的,所以特意去记录一下. 第一步:配置阿里云地址: 我 ...

  8. [组件封装]微信小程序-图片批量上传照片墙

    描述 批量上传图片, 可设置最大上传个数, 可删除, 可设置默认值. 效果 源码 pictures-wall.wxml <view class="picturesWall"& ...

  9. 微信小程序wx.uploadFile 上传文件 的两个坑

    fileUpload: function (tempFilePath) { var that = this;//坑1: this需要这么处理 wx.uploadFile({ url: url地址, / ...

随机推荐

  1. Java匹马行天下之C国程序员的秃头原因

    Java帝国的崛起 前言: 分享技术之前先请允许我分享一下黄永玉老先生说过的话:“明确的爱,直接的厌恶,真诚的喜欢.站在太阳下的坦荡,大声无愧地称赞自己.” <编程常识知多少> <走 ...

  2. TypeScript中使用getElementXXX()

    如果只是看解决方法,可以直接跳到第二小节 简述 Angular 1.x版本是用JavaScript编写的,我们在百度Angular经常会搜索到AngularJS,并不是JavaScript的什么衍生版 ...

  3. 微信小程序开发实战-天气小程序

    园龄6年8个月了,还一篇文章都没写过,惭愧! 最近周末做了个天气预报小程序,在这里整理一下开发过程和注意点,给对小程序开发感兴趣的伙伴们提供点参考. 废话不多说,先上图最终效果: 下面进入正文: 第一 ...

  4. 夯实Java基础系列22:一文读懂Java序列化和反序列化

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. MongoDB 学习笔记之 Aggregation Pipeline实战实现inner join

     Aggregation Pipeline实战实现inner join: leftT集合: comments集合: 现在我们要用aggregation实现inner join db.comments. ...

  6. 引入外部js

    引入外部js应该使用完整标签<script></script>,而使用单标签<script src=“”/>是错误的

  7. C#基于Quartz.NET实现任务调度并部署Windows服务

    一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...

  8. Web页面解析过程(浅)

    web页面流程 域名解析DNS 域名解析:把域名指向网络空间IP,让人们通过简单的域名访问Web网站的服务. DNS:域名系统 DNS服务器:记录着域名及其对应的IP地址 解析域名: ​ 浏览器中输入 ...

  9. deferred对象和promise对象(一)

    个人认为阮一峰老师讲的关于deferred对象是最容易理解的. deferred对象是jquery的回调函数解决方案.解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口. d ...

  10. 【THE LAST TIME】this:call、apply、bind

    前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...