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

前言

        技术支持: 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; …

OpenCV开发:编译安装opencv

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它为开发者提供了丰富的工具和函数&#xff0c;用于处理图像和视频数据&#xff0c;以及执行各种计算机视觉任务。 以下是 OpenCV 的一些主要特点和功能&#xff…

【Java】Spring Bean有几种配置方式?

定义 Spring Bcan 的3 种方式分别是:基于XML 的方式配置、基于注解扫播方式配置、基于元数据类的配置。 SpringBean是Spring中最基本的组成单元&#xff0c;Spring 官方文档对 Bean 的解释是这样的:In Spring, the objects that form the backbone of your application and tha…

华为HCIP认证H12-821题库上

1、2.OSPF核心知识 &#xff08;单选题&#xff09;下面关于0SPF的特殊区域&#xff0c;描述错误的是: A、Totally Stub Area允许ABR发布缺省的三类LSA,不接受五类LSA和细化三类LSA B、NSSA Area和Stub区域的不同在于该区域允许自治系统外部路由的引入&#xff0c;由ABR发布…

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 配置…

字符串排序算法

题目描述&#xff1a; 题目描述 设计一个程序&#xff0c;实现对输入字符串数组按字符串长度进行排序功能。具体要求如下&#xff1a;编写函数void sortByLength(char *strArray[], int numStrings);&#xff0c;用于对输入的字符串数组 strArray 按字符串长度进行升序排序。在…

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…

数据处理架构

目录 Lambda架构 Kappa架构 Lambda架构 Lambda架构由Twitter的首席科学家Nathan Marz提出。这种架构试图平衡延迟、吞吐量、容错性和系统复杂性四个方面&#xff0c;以满足大数据和实时数据处理的需求。Lambda架构主要由三个层次组成&#xff1a; 批处理层&#xff08;Batch…

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;可直接运行…

从零开发短视频电商 OpenSearch/Elasticsearch 查询总结

文章目录 Match Queries&#xff08;全文查询&#xff09;Term Queries&#xff08;词项查询&#xff09;Range Queries&#xff08;范围查询&#xff09;Wildcard Queries&#xff08;通配符查询&#xff09;Fuzzy Queries&#xff08;模糊查询&#xff09;Prefix Queries&…

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 二叉搜…

Elasticsearch 查询语法

引言 Elasticsearch&#xff08;ES&#xff09;是一个高度可扩展的开源全文搜索和分析引擎。它允许你快速、实时地存储、搜索和分析大量数据。ES 强大的查询语言是其核心功能之一&#xff0c;它提供了多种查询类型来满足各种复杂的搜索需求。在这篇博客中&#xff0c;我们将深…