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

涉及微信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. [Python] 09 - Multi-processing

    前言 资源 Ref: Python3 多线程 Ref: Python3之多进程       # python中的多线程无法利用多核优势 更多的提高效率的策略,请参见:[Pandas] 01 - A g ...

  2. [DE] Pipeline for Data Engineering

    How to build an ML pipeline for Data Science 垃圾信息分类 Ref:Develop a NLP Model in Python & Deploy I ...

  3. jvm对象内存分配

    一.jvm简单结构图 1.jvm内存对象分配整体流程: 1.类加载子系统和方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外, ...

  4. 使用Nexus3搭建Maven私服

    1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...

  5. SpringCloud搭建注册中心与服务注册

    上一篇文章<微服务注册中心原理,看这篇就够了!>介绍了注册中心的概念和原理,本文将介绍下利用Eureka搭建中心并注册服务到注册中心的过程. 本文目录 一.Eureka介绍二.搭建注册中心 ...

  6. Spring 梳理 - JavaConfig、SPI、SCI、SpringSCI、WebApplicationInitializer、AbstractAnnotationConfigDispatcherServletInitializer、WebMvcConfigurationSupport

    总结1: SCI:Servlet容器(Tomcat)提供的初始化Servlet容器本身的接口,可替换web.xml SpringSCI:SpringServletContainerInitialize ...

  7. 【ADO.NET基础-Session】Session的基本应用

    在服务端存储状态的对象:Session和Application 在客户端存储状态的对象:Cookie 1.Session:每个独立的浏览器都会创建一个独立的Session,不是一台电脑一个Sessio ...

  8. Spring Cloud Gateway 使用

    简介 Spring Cloud Gateway是Spring Cloud官方推出的网关框架,网关作为流量入口,在微服务系统中有着十分重要的作用,常用功能包括:鉴权.路由转发.熔断.限流等. Sprin ...

  9. Angular 元素拖拽

    拖动元素到指定区域 拖放的同时传递数据 1. 安装 ng2-drag-drop npm install ng2-drag-drop --save 2. 模板中配置可拖拽元素 // drag.compo ...

  10. 【柠檬班】史上最简单的Jmeter跨线程组取参数值的两种办法(不写代码)【原创】

    如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦,哪就是jmeter的变量值不能跨线程组传递.   看,官方就已经给出了解释.这个不是jmeter的缺陷,这是jmeter ...