微信网页vue-cropper剪裁图片及其Android 端无法显示问题

1. 需求描述

vue框架下的微信网页,需要在微信体系下,实现选择手机图片裁剪上传,选择vue-cropper来实现。

2.实现流程

2.1 配置微信JSSDK权限,调用相册,获取图片

首先需要采用微信的JSSDK来在微信中实现调用相册,并且选择图片的功能。具体实现步骤为这篇文章

2.2 安装vue-cropper插件并引用

安装插件:npm install vue-cropper
创建组件photoCutBox.vue 并在其中引用:

import { VueCropper }  from 'vue-cropper'

2.3 按照需求自定义配置,完成剪裁组件

自定义配置:

<template>
  <div class="photocutbox" v-if="isShowCut">
    <div class="phcut_wrap">
      <div class="phcut_wrap_box">
        <VueCropper ref="cropper"
            :img="imgurl"
            :fixedNumber="cutSize"
            :outputSize="option.size"
            :outputType="option.outputType"
            :info="true"
            :full="option.full"
            :canMove="option.canMove"
            :canMoveBox="option.canMoveBox"
            :original="option.original"
            :autoCrop="option.autoCrop"
            :fixed="option.fixed"
            :centerBox="option.centerBox"
            :infoTrue="option.infoTrue"
            :fixedBox="option.fixedBox"
            :autoCropWidth="option.autoCropWidth"
            :autoCropHeight="option.autoCropHeight"
				>

        </VueCropper>
      </div>

      <div class="phcut_wrap_bottom">
        <div @click="clickCancel">取消</div>
        <div @click="clickOK">确定</div>
      </div>
    </div>
  </div>
</template>

2.4 在页面调用组件

在需要页面中调用组件,并使用。

import photoCutBox from '@/components/photoCutBox'


components:{photoCutBox}

<photoCutBox :imgurl="cutimgurl" :isShowCut.sync="isShowCut" :cutSize="[1,1]" @finish="cutPhotoFinish"></photoCutBox>

按照逻辑,通过wx.chooseImage选择图片后,将该方法返回的localIds传入剪裁框,并且控制剪裁框显示,将出现剪裁框。
在这里插入图片描述

点击确定,调用vue-cropper中的方法,获取图片Base64数据.

//获取截图的base64 数据
this.$refs.cropper.getCropData((data) => {
  console.log(data)  
})

最终获得剪裁后的图片Base64数据。

3.Android 图片无法显示问题

测试发现iOS中功能正常,但Android中剪裁框无法显示选择的图片。

3.1 原因

在微信的JSSDK中,wx.chooseImage 调用相册选择图片接口,返回的是localIds(返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片)。该id在android的img标签中是可以直接用src赋值呈现图片的,而iOS中需要通过其转成Base64数据才可以在img标签显示
经过测试:在Android中,vue-cropper的图片呈现img标签,是无法显示localIds的id的图片的,需要跟iOS一样,需要转换成base64数据才能显示,这就是Android无法显示的原因。

3.2 解决方法

iOS端在wx.chooseImage 后需要调用wx.getLocalImgData来转换成Base64来显示。那么Android端也要转换成Base64来才能在vue-cropper中显示,那么也调用wx.getLocalImgData。但Android 中调用该方法返回的数据是不正确的,因为缺少base64数据头,因此需要做如下处理:

        this.$wx.getLocalImgData({
          localId: ids, // 图片的localID
          success:res=>{
            var localData = res.localData; //localData是图片的base64数据,可以用img标签显示
            if(!this.$store.state.isIphone){ // Android端处理数据
              localData = localData.replace(/\r|\n/g, '').replace('data:image/jgp', 'data:image/jpeg')
              localData = "data:image/jpg;base64," + localData;
            }
            return localData;
          }
        });

用此方法转换的Base64数据,将可以在vue-cropper中显示。解决android 中无法显示图片的问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值