微信小程序 实现上传图片前裁剪功能

前言

        技术支持: wx-cropper 裁剪

        总体思路是:安装完wx-cropper之后就它当成组件使用。在使用页面的地方引入组件就行。上传图片的逻辑不变,在 通过wx.chooseMedia() Api 拿到图片之后传递给子组件,子组件在拿到图片进行裁剪处理等操作之后,在把图片传递给父组件,父组件在拿到处理之后的图片,在进行自己之后的逻辑操作。简单来说就是------父组件上传图片-->子组件拿到图片进行处理-->处理的图片给父组件-->自己的逻辑操作

一. 引入wx-cropper

npm i @dw/wx-cropper

安装wx-cropper之后构建npm

二. 在需要使用的页面上引入

{"usingComponents": {"my-cropper": "@dw/wx-cropper"}
}

 三. 示例

        1. wxml代码

<button catchtap="handleuploadimg">上传图片</button><block wx:for="{{ fileList }}" wx:key="*this"><image src="{{ item }}" mode=""/>
</block><view class="layers" wx:if="{{cjtp}}"><my-cropper bind:close="hideCut" cutRatio="{{cutRatio}}" imageSrc="{{imageSrc}}" />
</view>

        2. wxss样式 

                这个是需要把裁剪功能组件覆盖到当前页面上

/* pages/upload/upload.wxss */
.layers{width: 100vw;height: 100vh;background-color: #00000080;position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index: 10000000;
}

 

        3. js代码

                当选择完图片时,显示裁剪功能,以及把上传的图片传给组件。当用户裁剪完图片之后,会通过组件getImageInfo方法处理图片之后,在通过子组件向父组件传值的方法,把裁剪处理完之后图片传递给父组件 _this.triggerEvent('close', img);

// pages/upload/upload.js
Page({/*** 页面的初始数据*/data: {fileList: [], //上传图片集合base64List: [], //base64集合delFileArr:[],  //删除的附件集合imgWidthslot: 0,imgHeightslot: 0,//裁剪信息cjtp: false,     //裁剪信息 这个控制裁剪功能的现实和隐藏cutRatio:0.75,  //裁剪比例imageSrc:'',    //个人图片},/*** 生命周期函数--监听页面加载*/onLoad(options) {},// 上传图片handleuploadimg() {wx.chooseMedia({count: 1,mediaType: ['image'],sourceType: ['camera', 'album'],success: (res) => {// this.setData({//   fileList: res.tempFiles// })var tempFilePaths = res.tempFiles;for (let i in tempFilePaths) {let imagePath = tempFilePaths[i].tempFilePath; //原图的路径let size = tempFilePaths[i].size;      //原图大小//this.setData({// imageSrc:imagePath,//cjtp:true,//})//判断是否需要压缩if(size > this.data.size){this.setCanvasLoad(imagePath);}else{this.setData({imageSrc:imagePath,cjtp:true,})}}}})},
// 压缩图片
setCanvasLoad(obj){let imagePath = obj; //原图的路径const ctx = wx.createCanvasContext('myfirstCanvasSlot',this);let that = this;wx.showLoading({title: '图片压缩中...',mask: true}) //不需要你可以删掉// console.log(imagePath,'原图的路径')wx.getImageInfo({src:imagePath,success:(res)=>{// console.log(res,'获取图片的属性')// 图片原始尺寸let originWidth = res.width;let originHeight = res.height;// 最大尺寸限制,可通过设置宽高来实现图片压缩程度let maxWidth = 1920,maxHeight = 800;// 目标尺寸let targetWidth = originWidth,targetHeight = originHeight;// 图片尺寸超过200x150的限制if(originWidth > maxWidth || originHeight > maxHeight) {if(originWidth / originHeight > maxWidth / maxHeight) {// 更宽,按照宽度限定尺寸targetWidth = maxWidth;targetHeight = Math.round(maxWidth * (originHeight / originWidth));} else {targetHeight = maxHeight;targetWidth = Math.round(maxHeight * (originWidth / originHeight));}}// canvas对图片进行缩放this.setData({imgWidthslot: targetWidth,imgHeightslot: targetHeight})// 压缩图片(绘制图像到画布)ctx.drawImage(imagePath,0,0,targetWidth,targetHeight);console.log(this.data.imgWidth)ctx.draw(false, ()=>{setTimeout(()=>{// canvas导出为图片路径wx.canvasToTempFilePath({canvasId: 'myfirstCanvasSlot',fileType: 'png', //支持jpg或pngquality: 0.92, //图片质量success:(res1)=> {wx.hideLoading();// console.log(targetWidth,targetHeight,'targetHeight')let compressedPath = res1.tempFilePath;//将图片转化为base64this.setData({imageSrc:compressedPath,cjtp:true,})},fail:(res1)=>{// console.log('图片压缩失败',res)wx.hideLoading()wx.showModal({content: '图片压缩失败',showCancel:false})}},that)},200)})},fail: (res) => {wx.hideLoading()// console.log(res,'获取图片的属性失败');wx.showModal({content: '图片压缩失败',showCancel:false})}})},//关闭裁剪hideCut(e){let obj = e.detail;let fileList = this.data.fileList;let base64List = this.data.base64List;//是否已经截取if(obj){console.log('------obj', obj)wx.showLoading({title: '裁剪中',})fileList = [ obj.path ]wx.getFileSystemManager().readFile({filePath: obj.path,encoding: "base64",success: (res) => {wx.hideLoading(); //不需要你可以删掉base64List = [res.data]this.setData({base64List: base64List,fileList: fileList,})console.log('-----res-----', this.data.base64List, this.data.fileList)},fail: (res) => {wx.hideLoading(); //不需要你可以删掉wx.showModal({content: '图片裁剪失败',showCancel:false})}})}this.setData({cjtp:false,})},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示*/onShow() {},/*** 生命周期函数--监听页面隐藏*/onHide() {},/*** 生命周期函数--监听页面卸载*/onUnload() {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh() {},/*** 页面上拉触底事件的处理函数*/onReachBottom() {},/*** 用户点击右上角分享*/onShareAppMessage() {}
})

父组件会通过hideCut方法 来拿到子组件传递过来的图片,然后在回显到页面上。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器原理

目录 一.路由器 1.路由器的转发原理 2.路由器的工作原理 二.路由表 1.路由表的形成 2.路由表表头含义 直连&#xff1a; 非直连&#xff1a; 静态 静态路由的配置 负载均衡&#xff08;浮动路由&#xff09; 默认路由 动态 三.交换与路由对比 一.路由器 1.路由器…

快速多列查找匹配关键字

实例需求&#xff1a;根据第一列专业名称&#xff0c;在“专业分类指导目录”中&#xff0c;针对三个学历层次&#xff08;研究生、本科生、专科生&#xff09;分别查找对应专业类别&#xff0c;填写在对应位置&#xff0c;即截图中的黄色区域。 需要注意如下两点&#xff1a; …

Linux完成mysql数据库的备份与恢复

背景&#xff1a; 在进行数据报表的测试过程中&#xff0c;为了让我们的测试数据更加真实&#xff0c;因此我们需要同步生产数据到测试环境。方式有很多种&#xff0c;我这里介绍的是通过Linux完成数据同步。 备份数据&#xff1a; 执行命令&#xff1a;mysqldump -uxxx -pxxx…

PyCharm连接远程服务器

要求&#xff1a;PyCharm专业版才支持远程服务 一、创建远程连接 先建立本地与远程服务器之间的SSH连接 1、配置连接 2、建立SSH连接&#xff0c;选择文件传输协议 SFTP 3、设置服务器名&#xff08;可以随意命名&#xff09; 4、配置 SSH连接 点击 172.18.1.202 配置…

bugkuctf web随记wp

常规思路&#xff1a; 1&#xff0c;源码2&#xff0c;抓包3&#xff0c;御剑dirsearch扫后台检查是否有git文件未删除4&#xff0c;参数 本地管理员&#xff1a;1&#xff0c;cu看源码&#xff0c;sci看源码有一串东西2&#xff0c;base64解码后是test123猜测是密码3&#x…

ChatGPT热门项目

1.智能GPT 项目地址&#xff1a;智能GPT&#xff1a;你只要提供OpenAI的API Key&#xff0c;那么它就可以根据你设定的目标&#xff0c;采用Google搜索、浏览网站、执行脚本等方式 主要语言&#xff1a;Python 推荐理由&#xff1a;这是由开发者Significant Gravitas推出的项目…

103基于matlab的极限学习机(ELM)和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机

基于matlab的极限学习机&#xff08;ELM&#xff09;和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机&#xff0c;该程序是三者的方法比对。 包括学习时间&#xff0c;训练精度和测试精度的对比。数据可更换自己 的&#xff0c;程序已调通&#xff0c;可直接运行…

SpringBoot之数组,集合,日期参数的详细解析

1.4 数组集合参数 数组集合参数的使用场景&#xff1a;在HTML的表单中&#xff0c;有一个表单项是支持多选的(复选框)&#xff0c;可以提交选择的多个值。 多个值是怎么提交的呢&#xff1f;其实多个值也是一个一个的提交。 后端程序接收上述多个值的方式有两种&#xff1a; 数…

MacOS升级指定的系统

问题描述&#xff1a; Mac升级系统&#xff0c;如果使用默认推送的升级可能会升级到最新 的版本&#xff0c;那么怎样才能升级制定的系统呢&#xff1f;1. 搜索“macOS安装器” 2. 点击“使用App store 或浏览器下载macOS安装器” 3. 选择需要的系统&#xff0c;使用App Store …

飞天使-docker知识点5-资源限制与容器的不同状态

文章目录 cpu和内存的限制内存限制的部分参数容器的不同状态docker images 的分层docker registry制作镜像 cpu和内存的限制 默认情况下&#xff0c;容器没有资源限制&#xff0c;可以使用主机内核调度程序允许的尽可能多的 给定资源&#xff0c;Docker 提供了控制容器可以限制…

JavaWeb项目中已经导入依赖却报错依赖不存在

问题描述 在使用 Maven Servlet Tomcat 来搭建 JavaWeb 项目时&#xff0c;在 pom.xml 中正确引入了依赖&#xff0c;编码过程中也能够正常使用。但是在启动 Tomcat 之后&#xff08;启动时或启动后&#xff09;&#xff0c;却报错显示该依赖不存在。 可能原因 pom.xml 的…

品牌如何做好软文营销?媒介盒子分享

许多公司在做软文营销时&#xff0c;试图通过运营不同平台来扩大其覆盖范围&#xff0c;他们希望通过这种方式触达更多受众&#xff0c;然而如果品牌软文没有质感&#xff0c;就会被用户抛弃。今天媒介盒子就来和大家聊聊&#xff1a;品牌方做内容时如何加强质感。 一、 营销需…

12.14_黑马数据结构与算法笔记Java

目录 120 二叉搜索树 min max 121 二叉搜索树 put 122 二叉搜索树 前任后任1 123 二叉搜索树 前任后任2 124 二叉搜索树 删除1 125 二叉搜索树 删除2 126 二叉搜索树 删除3 127 二叉搜索树 删除 递归1 128 二叉搜索树 删除 递归2 129 二叉搜索树 范围查询 130 二叉搜…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 单体gltf模型与Blender中的方向对应关系

作者&#xff1a;taco 在很多包含动画的场景中&#xff0c;像模拟小人的行走、模拟火车的轨迹运行&#xff0c;又或者是模拟风力发电等等等。我们通常会加一些动画模型到里面。而有的时候可能会出现&#xff0c;这火车怎么倒着走啊&#xff01;这人怎么头朝下啊。这种方向的问题…

WPS Office JS宏实现Excel转换为JSON格式数据

通过Excel JS宏&#xff0c;将表格中的数据以”列“形式导出为JSON数据格式。 我们在整理文档时&#xff0c;产品会通过Excel将功能点和功能描述分层级整理出来&#xff0c;有时需要将此数据导入到系统中&#xff0c;Web端对Json这类数据比较友好&#xff0c;所以这里试着使用E…

设计模式——代理模式(Proxy Pattern)

概述 代理模式是指为其他对象提供一种代理&#xff0c;以控制对这个对象的访问。代理对象在访问对象和目标对象之间起到中介作用。代理对象也可以在不修改目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;拓展目标对象的功能&#xff0c;比如说在目标对象的某个方法…

【Docker】进阶之路:(十二)Docker Composer

【Docker】进阶之路&#xff1a;&#xff08;十二&#xff09;Docker Composer Docker Compose 简介安装 Docker Compose模板文件语法docker-compose.yml 语法说明imagecommandlinksexternal_linksportsexposevolumesvolunes_fromenvironmentenv_fileextendsnetpiddnscap_add,c…

7+PPI+机器学习+实验,非肿瘤结合建模筛选生物标志物,可升级

今天给同学们分享一篇生信文章“Identification of diagnostic biomarkers and therapeutic targets in peripheral immune landscape from coronary artery disease”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.4。 结果解读&#xff1a; 外周血中…

构建外卖小程序:技术代码实践

在这个数字化的时代&#xff0c;外卖小程序已经成为餐饮业的一项重要工具。在本文中&#xff0c;我们将通过一些简单而实用的技术代码&#xff0c;向您展示如何构建一个基本的外卖小程序。我们将使用微信小程序平台作为例子&#xff0c;但这些原理同样适用于其他小程序平台。 …

Android其他组件(单选框)

一、单选框&#xff08;RadioGroup&#xff09; 单选框&#xff08;RadioGroup&#xff09;需要配合单选按钮&#xff08;RadioButton&#xff09;使用&#xff0c;同一个单选框中的单选按钮只能被选中一个&#xff0c;默认是一个都不选中。 RadioGroup的常见属性&#xff08…