小程序图片裁剪组件基于image-cropper(修改版)

本文介绍了在微信小程序中使用image-cropper插件实现图片裁剪功能时遇到的图片失真和体积过大的问题。通过分析原因,作者提出了解决方案,包括根据图片原始宽度调整裁剪比例以避免拉伸,以及按比例压缩图片质量。此外,还提到了wx.getImageInfo接口在特定情况下的图片宽高取反问题,并提供了修正方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司的小程序产品突然让把之前做的压缩图片上传加一个裁剪缩放选中功能。

从微信社区里找了一下,目前最火的image-cropper插件地址
有一说一这款插件的功能文档描述得挺全的(不像某信写的文档),看了一下源码,用的小程序的自定义组件
在这里插入图片描述
直接复制组件到compoents里就可以使用了。

不过样式明显不符合自己的需求。经过一番修改最终的效果:
在这里插入图片描述
在这里插入图片描述
结果项目上线后没几天就有用户反馈上传的图片变模糊了在这里插入图片描述

分析了一下原因,在PS里面绘制非矢量图放大或缩小会损失像素。这里我注意到在生成图片的宽高用的是裁剪框宽高乘以固定的比例,而这里的生成的图片是基于画布绘制不存在矢量图一说,那么当图片的宽度小于裁剪框乘以比例后的宽度,就会被拉伸到同样裁剪框比例的宽度从而导致图片失真并且还会加大图片的体积,同理大图缩小同样会导致图片失真。
在这里插入图片描述
在这里插入图片描述
那么只要解决生成的图片宽度不被拉伸或缩小就行了,在一开始源码里的pushImg选取图片后就获取图片的宽度,然后通过和裁剪宽相比计算出裁剪框的多少倍可以和图片宽度一样。最后再把这个倍数赋值给export_scale就可以原图宽高裁剪生成。而这里我想压缩一下图片的质量,只需要再把这个倍数*0.8就可以控制图片压缩到80%
在这里插入图片描述
后面的反馈中又发现了一个微信的坑,wx.getImageInfo在开发工具和某些机型上获取图片宽高,如果图片的原始信息上方向为right或left,会把宽高的值取反导致绘制的图片直接变形。这里需要判断一下方向将宽高改回来

pushImg(src) {
      if (src) {
        this.setData({
          imgSrc: src
        });
        //发现是手动赋值直接返回,交给watch处理
        return;
      }
      // getImageInfo接口传入 src: '' 会导致内存泄漏
      if (!this.data.imgSrc) return;
      //获取选取的图片的高度
      wx.getImageInfo({
        src: this.data.imgSrc,
        success: (res) => {
          let width = res.width;
          this.data.imageObject = JSON.parse(JSON.stringify(res)); // 深拷贝防止同时修改了res
          if(res.orientation == 'right' || res.orientation == 'left'){
            // 方向旋转了90度图片信息会把宽高取反,需要把宽和高改回来
           this.data.imageObject.width = res.height;
           width = res.height;
           this.data.imageObject.height = res.width;
          }
          // 原图宽高
          let export_scale = width/this.data.width; //调整生成图片的比例
          if(width > 2000){
            // 如果图片宽度大于2000以上的高清图
            this.setData({
              export_scale: export_scale*0.3, // 同时渲染画布上绘图比例同时压缩成30%大小
            })
          } else {
            this.setData({
              export_scale: export_scale*0.8, // 同时渲染画布上绘图比例同时压缩成80%大小
            })
          }
          //图片非本地路径需要换成本地路径
          if (this.data.imgSrc.search(/tmp/) == -1) {
            this.setData({
              imgSrc: res.path
            });
          }
          //计算最后图片尺寸
          this._imgComputeSize();
          if (this.data.limit_move) {
            //限制移动,不留空白处理
            this._imgMarginDetectionScale();
          }
          this._draw();
        },
        fail: (err) => {
          this.setData({
            imgSrc: ''
          });
        }
      });
    },

至于后面的一些样式方法直接看image-cropper(修改版)就行了,注意这里是我自己添加的上传图片的方法,可以自行修改
在这里插入图片描述

Vue是一种用于构建Web界面的JavaScript框架,可以用于创建具有微信扫码登录功能的网站。下面是一个关于如何在Vue中接入微信扫码登录功能的详细教程。 1. 首先,你需要在微信开放平台注册一个应用,获得一个AppID和AppSecret。 2. 在Vue项目中安装wechat-auth插件,可以使用npm命令进行安装。 3. 在项目的入口文件main.js中导入wechat-auth插件,并使用Vue.use()将其安装到Vue中。 4. 创建一个Login.vue组件,用于显示微信扫码登录界面,并导入微信扫码登录所需的样式和图片。 5. 在Login.vue组件的created钩子函数中,调用微信登录接口的Auth.login()方法,传入AppID和登录成功后的回调函数。 6. 在回调函数中,获取微信扫码登录成功后返回的code,并发送到后端服务器进行验证。后端服务器通过code和AppSecret去微信服务器换取access_token和openid。 7. 在后端服务器中,验证access_token和openid的有效性,如果验证成功,则说明用户已经登录成功,可以返回用户相关的信息给前端。 8. 前端收到后端返回的用户信息后,可以根据需求进行相应的处理,例如展示用户头像、昵称等信息。 9. 在Login.vue组件中,可以根据登录状态显示不同的页面内容,例如已登录状态下显示用户信息,未登录状态下显示微信扫码登录按钮。 10. 添加微信扫码登录按钮的点击事件,在事件处理函数中调用Auth.login()方法进行微信扫码登录。 以上就是在Vue中接入微信扫码登录功能的详细流程和示例源代码。在实际应用中,你可以根据具体的需求进行适当的修改和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值