微信小程序中裁剪图片以及压缩到指定尺寸并上传

news/2024/11/23 23:13:59/

本文分为两个内容,分别是裁剪图片和压缩

引出问题

1.为何要裁剪图片
因为需要上传头像,但是每个型号的手机拍出来的照片尺寸都不太一样,不能统一,所以,希望在上传之前进行自主裁剪,保证上传到服务器上的尺寸一致,规范管理。

2.为何要压缩图片
因为我们用于读取头像照片的另一端硬件对文件大小非常敏感,太大保存失败,所以进行压缩。
而微信小程序中自带的压缩图片的方法为 wx.compressImage 要求比较严格,还不能够压缩成自己想要的尺寸和大小。所以被弃用了,我们另外找了一个方法来压缩成我们需要的文件大小。

裁剪图片

我们裁剪图片用的是 image-cropper 这个组件

小程序试用:
在这里插入图片描述

因为文档比较麻烦,我直接下载了代码来看使用方法。

根据文档以及代码,我们看到,这个 demo 页面是独立了一个上传页面,然后引入了这个组件。

文件目录格式:
在这里插入图片描述
cropper 就是当前页面,引入的就是 component 里的 image-cropper

展示页面
在这里插入图片描述
我们进行了一部分改造,把原来是页面的功能,根据要求改成了组件

在这里插入图片描述
因为上下左右那些功能,均可用手势完成,就去除了这一部分功能。

将页面修改成 组件需要注意一些问题:

  • 设置优先级,不然有内容穿透问题
  • 用 if 控制显示与否的时候,初始化组件,之前是在页面加载的时候初始化,现在显示的时候初始化;也可以直接使用 hidden ,这样组件始终都渲染只是不显示而已
    在这里插入图片描述

压缩图片到指定大小

这个的思路就是将图片重绘成 canvas 然后把 canvas 导出成我们需要尺寸的图片并上传。

现在 wxml 中添加一个 canvas 画布,但是不能出现在页面视野中。
由于 canvas 不能够显示隐藏,所以使用 样式控制

<canvas canvas-id="attendCanvasId" style="width:{{canvasWidth}}px;height:{{canvasHeight}}px;position: absolute;left:-8000px;top:-8000px;"></canvas>
/*** 组件的初始数据*/data: {src: '',canvasWidth: 0,canvasHeight: 0,imageShow: false},
//如果图片大于1M就要进行压缩处理
if (res.size > 200000) {wx.showLoading({title: '正在压缩中...',mask: true})//获取图片信息wx.getImageInfo({src: file.url,success: function (rr) {var ctx = wx.createCanvasContext('attendCanvasId', that);var ratio = 1;var canvasWidth = rr.widthvar canvasHeight = rr.height;var quality = 0.3; //图片质量while (canvasWidth > 1000 || canvasHeight > 1000) {//比例取整canvasWidth = Math.trunc(rr.width / ratio)canvasHeight = Math.trunc(rr.height / ratio)ratio += 0.1;}quality = (quality + (ratio / 10)).toFixed(1);if (quality > 1) {quality = 1;}//设置canvas尺寸that.setData({canvasWidth: canvasWidth,canvasHeight: canvasWidth});ctx.drawImage(file.url, 0, 0, canvasHeight, canvasWidth); //将图片填充在canvas上ctx.draw();//下载canvas图片setTimeout(function () {wx.canvasToTempFilePath({canvasId: 'attendCanvasId',width: canvasWidth,height: canvasWidth,destWidth: canvasWidth,destHeight: canvasHeight,fileType: 'jpg',quality: quality,success: function success(path) {wx.hideLoading()//这里是将图片上传到服务器中that.upload(path.tempFilePath);},fail: function fail(e) {wx.hideLoading();wx.showToast({title: '头像上传失败',icon: 'none',duration: 2000});}}, that);}, 1000);}});
} else { //小于1M的就不用压缩了that.upload(file.url)
}

以上代码均为部分代码,非完整代码,请选择复制

为了压缩也曾百度过很多方法,只有这个比较实用和简单。可留言,互相交流


http://www.ppmy.cn/news/789782.html

相关文章

html5 手机端 剪裁,用Canvas实现h5移动端图片裁剪

前阵子七夕的时候搞了一个h5活动页,需要做一个本地图片的裁剪上传功能,用于生成一些特定的表白图片。主要是用到了H5的FileApi 和 Canvas。个人感觉图片裁剪功能还是很实用的,故写篇文章分享一下。 (PS:这个demo本来是移动端的,但了为了方便录制效果,所以我用chrome模拟地…

android 7.0 手机拍照裁剪问题

在android7.0 之前 &#xff0c;如果需要用到拍照的时候 我们一般都这样去写 //先新建一个File类型的对象 File filenew File(Environment.getExternalStorageDirectory(), "/img/"System.currentTimeMillis() ".jpg"); if (!file.getParentFile().exist…

怎样裁剪照片大小尺寸?如何在线编辑图片?

在日常生活中&#xff0c;经常会用手机拍摄各种图片&#xff0c;有些时候在上传使用的时候&#xff0c;有时候需要对图片进行裁剪才能使用&#xff0c;那么不下载软件的话&#xff0c;怎样才能快速裁剪图片尺寸&#xff0c;以达到自己的使用需要呢&#xff1f;下面给大家分享一…

手机怎么把照片调整成二寸?教你一招轻松修改尺寸

怎么使用手机把照片的尺寸修改成二寸呢&#xff1f;随着科技的发展&#xff0c;现在的生活已经越来越便捷。我们不仅可以随时随地通过手机拍照&#xff0c;还可以通过手机应用程序进行照片处理。在日常生活中&#xff0c;我们经常需要提交一些证件&#xff0c;如身份证、驾驶证…

QtWebApp介绍、下载和搭建http轻量级服务器Demo

一、QtWebApp介绍 QtWepApp是一个C中的HTTP服务器库&#xff0c;其灵感来自Java Servlet。适用于Linux、Windows、Mac OS和Qt Framework支持的许多其他操作系统。   QtWebApp包含以下组件&#xff1a; • HTTP(S)1.0和1.1服务器 • 模板引擎 • 缓冲记录器   这些组件可以…

DevOps系列文章 之 Java使用jgit管理git仓库

最近设计基于gitops新的CICD方案,需要通过java读写git仓库&#xff0c;这里简单记录下。 在jgit中&#xff0c;存在最核心的三个组件&#xff1a;Git类&#xff0c;Repository类。Git类中包含了push commit之类的常见git操作&#xff0c;而Repository则实现了仓库的初始化和基…

数据结构--单链表

目录 1.单链表的定义&#xff1a; 单链表基本操作的实现&#xff1a; 2.单链表的初始化&#xff08;构造带头结点的空表&#xff09; 2.将头结点的指针域置空 3.链表是否为空&#xff1a; 4.单链表的销毁&#xff1a; 5.单链表的清空: 6.求单链表的表长&#xff1a; 7…

最长公共子序列LCA

最长连续公共子序列 题目链接:3692. 最长连续公共子序列 - AcWing题库 /*解法:定义dp[i1][j1]为以a[i]结尾的字符串和b[j]结尾的字符串的最长连续公共子序列那么对于a[i] b[j]的时候 dp[i1][j1] dp[i][j]1否则为0 其他就是细枝末节 */ #include<iostream> #include<…