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

前言

        技术支持: 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或png
                quality: 0.92, //图片质量
                success:(res1)=> {
                    wx.hideLoading();
                    // console.log(targetWidth,targetHeight,'targetHeight')
                    let compressedPath = res1.tempFilePath;
                    //将图片转化为base64
                    this.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方法 来拿到子组件传递过来的图片,然后在回显到页面上。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT如何做科研??

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

算法:单链表反转

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、问题描述 二、栈解法Stack 三、三指针法 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、问题描述 有个单链表&#xff0c;现…

Gitlab基础篇: Gitlab docker 安装部署、Gitlab 设置账号密码

文章目录 1、环境准备2、配置1)、初始化2)、修改gitlab配置文件3)、修改docker配置的gitlab默认端口 gitlab进阶配置gitlab 设置账号密码 1、环境准备 安装docker gitlab前确保docker环境&#xff0c;如果没有搭建docker请查阅“Linux docker 安装文档” docker 下载 gitlab容…

阿里云SLS日志服务之数据导入与加工处理

一、背景 采集vm虚拟机上的Log日志文本&#xff0c;如果需要经过特殊的加工处理&#xff0c;在本文主要讲述如何在SLS把kafka采集上来的数据经导入并加工后存储。 二、数据流转图 三、数据导入 服务地址&#xff1a;填写kafka集群的地址数据格式&#xff1a;json字符串&#…

libevent服务GET/POST的简单使用

目录 1、前言2、测试demo2.1、目录结构2.2、 测试源码2.2.1、http_server.cpp2.2.2、 http_server.h 2.3、 编译2.4、 运行结果2.4.1、测试POST2.4.2 、测试GET请求 1、前言 项目开发中经常需要使用到私有协议和Qt,Android等GUI前端通信&#xff0c;比较常用的使用POST和GET方式…

《算法通关村——透彻理解动态规划》

《算法通关村——透彻理解动态规划》 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff…

Matlab示例-Examine 16-QAM Using MATLAB学习笔记

​工作之余学习16-QAM 写在前面 网上看到许多示例&#xff0c;但一般都比较难以跑通。所以&#xff0c;还是老方法&#xff0c;先将matlab自带的例子研究下。 Examine 16-QAM Using MATLAB Examine 16-QAM Using MATLAB 或者&#xff0c;在matlab中&#xff0c;键入&#x…

Re9 Attention is all you need

变形金刚&#xff0c;启动&#xff01; Abstract 主流序列转录模型基于复杂的循环神经网络和卷积神经网络&#xff0c;包括一个encoder和decoder&#xff0c;同时在这之中使用一个叫注意力机制attention的东西本文提出了一个简单的网络架构&#xff0c;仅仅使用注意力机制&am…

【论文阅读】O’Reach: Even Faster Reachability in Large Graphs

Hanauer K, Schulz C, Trummer J. O’reach: Even faster reachability in large graphs[J]. ACM Journal of Experimental Algorithmics, 2022, 27: 1-27. Abstract 计算机科学中最基本的问题之一是可达性问题&#xff1a;给定一个有向图和两个顶点s和t&#xff0c;s可以通过…

(1)Linux的 安装与用户的创建

前言 本章正式开始Linux的学习 如果关于Linux环境搭配有问题的朋友 可以阅读此文章:Linux环境搭建 一&#xff0c;浅用一下吧 —— Hello, Linux! 我们现在已经登陆上了&#xff0c;我们当然可以用它来做很多事。 我们来用它写一个 "Hello, Linux!" &#xff0c;来…

Layui继续学习

1、简单评论区代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>社区评论区</title> <link rel"stylesheet" href"https://cdn.staticfile.org/layui/2.6.8/css/…

关于“Python”的核心知识点整理大全20

目录 ​编辑 9.2 使用类和实例 9.2.1 Car 类 下面来编写一个表示汽车的类&#xff0c;它存储了有关汽车的信息&#xff0c;还有一个汇总这些信息的方法&#xff1a; car.py 9.2.2 给属性指定默认值 9.2.3 修改属性的值 1. 直接修改属性的值 2. 通过方法修改属性的值 3.…

记录Oracle Exadata X8M-2 存储服务器告警灯亮的处理过程(/SYS/MB/P0PCIE7)

文章目录 概要调查流程处理方式&#xff1a; 概要 现场服务器告警灯亮&#xff0c;其他服务器正常&#xff0c;磁盘灯正常&#xff0c;所以从整体来看应是内部部件抛出的异常问题&#xff0c;需要登录机器确认&#xff1a; 调查流程 通过ILOM web界面查看服务器状态进行信息…

基于轻量级GhostNet模型开发构建工业生产制造场景下滚珠丝杠传动表面缺陷图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

低代码与自动化:加速软件开发的新趋势

低代码与自动化技术正在逐渐改变软件开发的面貌。随着科技的不断发展&#xff0c;传统的编程方式已经不再是唯一的选择。低代码和自动化技术正在为开发者提供更高效、更灵活的开发环境&#xff0c;使得软件开发变得更加简单、快速和高效。 低代码和自动化技术正在逐渐改变软件开…

el-table自定义表格数据

如上所示&#xff1a; 表格内的数据是&#xff1a;当前班级所在名次段的人数 / 当前班级1至n名的累计人数 5/12 也就是 5/75 需要变更为&#xff1a; 截至到当前名次段总人数&#xff08;上次考试&#xff09; / 截至到当前名次段总人数&#xff08;本次考试&#xff09…

使用VBA快速统计词组词频(多单词组合)(2/2)

实例需求&#xff1a;产品清单如A列所示&#xff0c;现在如下统计多单词组合词组词频。 在上一篇博客中《使用VBA快速统计词组词频(多单词组合)&#xff08;1/2&#xff09;》讲解了如何实现双词的词频统计。 本文将讲解如何实现3词的词频统计&#xff0c;掌握实现方法之后&a…

android studio 快捷输入模板提示

在Android开发中&#xff0c;我们经常会遇到一些重复性的代码&#xff0c;例如创建一个新的Activity、定义一个Getter方法等。为了提高开发效率&#xff0c;Android Studio提供了Live Templates功能&#xff0c;可以通过简化输入来快速生成这些重复性代码。 按下图提示设置&am…

做博客网站需要什么配置的服务器?

​  利用搭建博客网站&#xff0c;来分享生活、知识和经验&#xff0c;是很多个人站长乐意做的事情。但&#xff0c;对于互联网行业的新人来说&#xff0c;或许不知道搭建个人博客网站的配置如何选择&#xff0c;本文针对这一点&#xff0c;从地域、服务器类型、配置参数等方…

使用动画曲线编辑器打造炫酷的3D可视化ACE

前言 在制作3D可视化看板时&#xff0c;除了精细的模型结构外&#xff0c;炫酷的动画效果也是必不可少的。无论是复杂的还是简单的动画效果&#xff0c;要实现100%的自然平滑都是具有挑战性的工作。这涉及到物理引擎的计算和对动画效果的数学建模分析。一般来说&#xff0c;只…