微信公众号-图片裁剪并实现上传

一、背景

最近有个需求,需要用户按比例上传图片,即需要在上传前,让用户手动对图片进行裁剪。

看到这个诉求,我就去扒微信的api,发现有个属性叫wx.cropImage是做图片裁剪的,且可以传入对应的裁剪比例。在介入开发后才发现,这个是小程序的api,而非微信公众号的。阅读文档发现,小程序和微信公众号中都有一个叫chooseImage的api,但是返回的数据却不一样,小程序大家开发的都比较多了。本篇文章主要给大家讲一下公众号的图片裁剪&上传,实现效果如下图:

二、图片选择

选择图片使用chooseImage这个api,具体使用如下所示。选择成功后,返回localIds,是选定照片的本地ID列表,注意这个和小程序是不同的。

wx.chooseImage({count: 1, // 默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: (res)=> {let localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片}
});

三、预览图片

wx.previewImage({current: '', // 当前显示图片的http链接urls: [] // 需要预览的图片http链接列表
});

四、获取本地图片

通过chooseImage拿到本地图片id 列表后,那么如何获取到图片呢。毕竟我们也没有办法直接使用图片id进行上传等交互。这个时候就引入了新的api,即:getLocalImgData。该api就是通过图片的localID,来获取图片的base64数据。拿到该数据后,就可以和后端接口进行交互了。

wx.getLocalImgData({localId: '', // 图片的localIDsuccess: function (res) {var localData = res.localData; // localData是图片的base64数据,可以用img标签显示}
});

五、上传图片

wx.uploadImage({localId: '', // 需要上传的图片的本地ID,由chooseImage接口获得isShowProgressTips: 1, // 默认为1,显示进度提示success: function (res) {var serverId = res.serverId; // 返回图片的服务器端ID}
});

六、图片裁剪

上述我们得知,微信公众号是没有裁剪api的,那么我们只能通过三方插件来实现裁剪功能。

这里我使用到的插件是vue-cropper

插件:GitHub - xyxiao001/vue-cropper: A simple picture clipping plugin for vue

1、安装

yarn add vue-cropper

2、组件封装

组件具体的使用,我这里就不赘述了,上述github上有详细的使用文档。我这里贴下我封装组件的代码吧。


<template><div class="home"><div class="cropper"><vueCropperref="cropper":img="image":outputSize="option.outputSize":outputType="option.outputType":canScale='option.canScale':autoCrop='option.autoCrop':autoCropWidth='option.autoCropWidth':autoCropHeight='option.autoCropHeight':canMoveBox='option.canMoveBox':canMove='option.canMove':centerBox='option.centerBox':info='option.info':fixedBox='option.fixedBox'@realTime='realTime'></vueCropper></div><div class="btn"><van-button type='default' style="margin-right: 20px;" size="small" @click='cancel'>取消</van-button><van-button type='primary' size="small" @click='handleClick'>确定</van-button></div></div>
</template>
<script>
import { VueCropper } from "vue-cropper";
export default {props: {image:[String, Array]},data() {return {option: {outputSize: 1, // 裁剪生成图片质量outputType: "jepg", // 裁剪生成图片格式canScale: true, // 图片是否允许滚轮播放autoCrop: true, // 是否默认生成截图框 falseinfo: false, // 是否展示截图框信息autoCropWidth: 300, // 生成截图框的宽度autoCropHeight: 200, // 生成截图框的高度canMoveBox: true, // 截图框是否可以拖动fixedBox: true, // 固定截图框的大小canMove: false, // 上传图片是否可拖动centerBox: true, // 截图框限制在图片里面},previewImg: null, // 预览后的图片previewObj: {width: 200,height: 200,},imgObj: {width: 500,height: 500,},};},components: {VueCropper,},methods: {cancel(){this.$emit('cancel')},handleClick() {this.$refs.cropper.getCropData((data) => {this.$emit('afterCropImage',data)});},},mounted() {},
};
</script>
<style  scoped>
.home {width: 100%;height: 100%;background-color: #eee;}
.cropper {width: 100%;height: 80%;border: 1px solid orange;
}
.btn{text-align: center;margin-top: 10px;
}
</style>

上述代码就可以实现图片的裁剪,具体的样式可以自己进行调整。props中的image可以传入base64的图片数据。

如果需要对剪切的图片进行实时预览,可以加入以下代码:

 realTime(data) {const that = this;this.$refs.cropper.getCropBlob((data) => {this.blobToDataURI(data, function(res) {console.log(res);that.previewImg = res;});});},blobToDataURI(blob, callback) {var reader = new FileReader();reader.readAsDataURL(blob);reader.onload = function(e) {callback(e.target.result);};},

七、微信公众号实现图片选择&裁剪&上传

接下来就是重点部分了,这里我只提供核心代码进行参考哈。

1、组件使用

 <van-popup v-model="isShow"  :style="{ height: '100%',width: '100%' }"><VueCropper ref="vueCropper" :image="image" @afterCropImage="afterCropImage"  /></van-popup>

  2、js代码,实现图片选择&裁剪&上传

chooseImg() {window.wx.chooseImage({count:1,sizeType: ['compressed'],sourceType: ['album', 'camera'],success: function (res) {this.getImgData(res.localIds)}})}   getImgData(localId) {window.wx.getLocalImgData({localId: localId,success: async (res)=> {let base64 = res.localDatalet localData = base64;localData = localData.replace(/\r|\n/g,"").replace("data:image/jgp", "data:image/jpeg");this.isShow = true  // 此处把组件显示出来this.image = localData  // image为传入组件内的土拍呢数据},fail () {reject(new Error('getLocalImgData 调用失败'))}})
}   afterCropImage(base64){this.isShow = false // 关闭裁剪组件this.uploadBase64(base64)},  uploadBase64(){// 上传,业务代码这里不做展示了,自定义即可}

以上就是全部的内容了,感觉公众号实现该功能的相关文档比较少,所以写篇文章进行记录。有疑问欢迎留言交流~~~~~~

微信文档链接:概述 | 微信开放文档

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

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

相关文章

Leetcode - 2580. 统计将重叠区间合并成组的方案数

文章目录 思路AC CODE总结 题目链接&#xff1a;2580. 统计将重叠区间合并成组的方案数 思路 一个区间合并的板子&#xff0c;计算出区间数目之后&#xff0c;每个区间都有放左和放右两种选法&#xff0c;所以最后的答案就是 2 k 2^k 2k。但是需要用c进行二维数组的排序&…

大模型时代的程序员:不会用AIGC编程,未来5年将被淘汰?

过去&#xff0c;初级程序员入职学习编程时&#xff0c;往往是师傅给一个任务需求&#xff0c;教大体的思路&#xff0c;然后在初级程序员写出代码工作当中培训和纠正&#xff0c;针对不同的命题告诉不同的方案&#xff0c;直到初级程序员把这些经验学会。 但大模型的到来把这…

【MySQL数据库】Table ‘xxx‘ doesnot exist错误解决

有两种可能性&#xff1a; 1、数据库中确实不存在这张表了&#xff0c;检查表被删除的原因。 2、数据库中存在表&#xff0c;但还报表不存在的错误&#xff0c;检查MySQL数据库的自动更新是否关闭&#xff0c;如果没有的话就通过图中所示方式关闭。

C++ | Leetcode C++题解之第1题两数之和

题目&#xff1a; C 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hashtable;for (int i 0; i < nums.size(); i) {auto it hashtable.find(target - nums[i]);if (it …

差分与前缀和

目录 差分法 例题&#xff1a;大学里的树木要打药 前缀和 例题&#xff1a;大学里的树木要维护 差分法 差分法的应用主要是用于处理区间问题&#xff0c;当一个数组要在很多不确定的区间&#xff0c;加上相同的一个数&#xff0c;我们如果每个数都进行加法操作的话&#x…

备忘录软件哪款可以加密?备忘录app怎么加密?

在快节奏的现代生活中&#xff0c;备忘录软件已成为我们不可或缺的助手。它不仅能方便我们随时记录任务事项&#xff0c;捕捉生活中的灵感&#xff0c;还便于我们随时修改和查看记录内容&#xff0c;实用性极高。然而&#xff0c;随着记录内容的增多&#xff0c;数据安全性问题…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-修改分机注册间隔时间

文章目录 前言联系我们例子问题一问题二 前言 注册周期&#xff1a;SIP客户端会每隔设定的时间发送一次注册请求&#xff0c;freeswitch 如果收到客户端的注册请求&#xff0c;就会让你注册成功&#xff1b;但如果在设定的时间内&#xff0c;freeswitch 任没有收到软件的注册请…

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台&#xff0c;它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面&#xff0c;并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点&#xff1a; 集中管理&am…

Netty核心原理剖析与RPC实践11-15

Netty核心原理剖析与RPC实践11-15 11 另起炉灶&#xff1a;Netty 数据传输载体 ByteBuf 详解 在学习编解码章节的过程中&#xff0c;我们看到 Netty 大量使用了自己实现的 ByteBuf 工具类&#xff0c;ByteBuf 是 Netty 的数据容器&#xff0c;所有网络通信中字节流的传输都是…

【2024年IntelliJ IDEA连接redis数据库 】

1&#xff1a;显示 tools window bar&#xff0c;打开database选项 2&#xff1a;添加redis连接信息&#xff1a; 3&#xff1a;填写host主机&#xff0c;端口号&#xff0c;有密码的天上密码&#xff0c;redis没有username&#xff0c;不用填。Test Connection。没问题就Apply…

15 - grace序列处理 - 十三点滑动平均法

grace序列处理 -十三点滑动平均法 滑动平均是一种常用的平滑数据的方法,可以用于去除噪声或者提取趋势。十三点滑动平均是指使用窗口大小为13的滑动平均,应用于GRACE序列处理中可以去除周年项的影响。 十三点滑动平均的计算公式为: y [ n ] = ( x [ n − 6 ]

String、StringBuffer、StringBuilder类

最近在复习 Java 基础的时候&#xff0c;看到了 String 这块的内容&#xff0c;我突发奇想&#xff0c;可以将 String、StringBuffer、StringBuilder 这些知识点整合在一起记忆。我之前背的那个答案其实有点琐碎&#xff0c;而且不太好理解&#xff0c;还繁杂&#xff0c;所以我…