当前位置:   article > 正文

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

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

一、背景

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

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

二、图片选择

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

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

三、预览图片

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

四、获取本地图片

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

  1. wx.getLocalImgData({
  2. localId: '', // 图片的localID
  3. success: function (res) {
  4. var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
  5. }
  6. });

五、上传图片

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

六、图片裁剪

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

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

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

1、安装

yarn add vue-cropper

2、组件封装

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

  1. <template>
  2. <div class="home">
  3. <div class="cropper">
  4. <vueCropper
  5. ref="cropper"
  6. :img="image"
  7. :outputSize="option.outputSize"
  8. :outputType="option.outputType"
  9. :canScale='option.canScale'
  10. :autoCrop='option.autoCrop'
  11. :autoCropWidth='option.autoCropWidth'
  12. :autoCropHeight='option.autoCropHeight'
  13. :canMoveBox='option.canMoveBox'
  14. :canMove='option.canMove'
  15. :centerBox='option.centerBox'
  16. :info='option.info'
  17. :fixedBox='option.fixedBox'
  18. @realTime='realTime'
  19. ></vueCropper>
  20. </div>
  21. <div class="btn">
  22. <van-button type='default' style="margin-right: 20px;" size="small" @click='cancel'>取消</van-button>
  23. <van-button type='primary' size="small" @click='handleClick'>确定</van-button>
  24. </div>
  25. </div>
  26. </template>
  27. <script>
  28. import { VueCropper } from "vue-cropper";
  29. export default {
  30. props: {
  31. image:[String, Array]
  32. },
  33. data() {
  34. return {
  35. option: {
  36. outputSize: 1, // 裁剪生成图片质量
  37. outputType: "jepg", // 裁剪生成图片格式
  38. canScale: true, // 图片是否允许滚轮播放
  39. autoCrop: true, // 是否默认生成截图框 false
  40. info: false, // 是否展示截图框信息
  41. autoCropWidth: 300, // 生成截图框的宽度
  42. autoCropHeight: 200, // 生成截图框的高度
  43. canMoveBox: true, // 截图框是否可以拖动
  44. fixedBox: true, // 固定截图框的大小
  45. canMove: false, // 上传图片是否可拖动
  46. centerBox: true, // 截图框限制在图片里面
  47. },
  48. previewImg: null, // 预览后的图片
  49. previewObj: {
  50. width: 200,
  51. height: 200,
  52. },
  53. imgObj: {
  54. width: 500,
  55. height: 500,
  56. },
  57. };
  58. },
  59. components: {
  60. VueCropper,
  61. },
  62. methods: {
  63. cancel(){
  64. this.$emit('cancel')
  65. },
  66. handleClick() {
  67. this.$refs.cropper.getCropData((data) => {
  68. this.$emit('afterCropImage',data)
  69. });
  70. },
  71. },
  72. mounted() {},
  73. };
  74. </script>
  75. <style scoped>
  76. .home {
  77. width: 100%;
  78. height: 100%;
  79. background-color: #eee;
  80. }
  81. .cropper {
  82. width: 100%;
  83. height: 80%;
  84. border: 1px solid orange;
  85. }
  86. .btn{
  87. text-align: center;
  88. margin-top: 10px;
  89. }
  90. </style>

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

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

  1. realTime(data) {
  2. const that = this;
  3. this.$refs.cropper.getCropBlob((data) => {
  4. this.blobToDataURI(data, function(res) {
  5. console.log(res);
  6. that.previewImg = res;
  7. });
  8. });
  9. },
  10. blobToDataURI(blob, callback) {
  11. var reader = new FileReader();
  12. reader.readAsDataURL(blob);
  13. reader.onload = function(e) {
  14. callback(e.target.result);
  15. };
  16. },

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

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

1、组件使用

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

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

  1. chooseImg() {
  2. window.wx.chooseImage({
  3. count:1,
  4. sizeType: ['compressed'],
  5. sourceType: ['album', 'camera'],
  6. success: function (res) {
  7. this.getImgData(res.localIds)
  8. }
  9. })
  10. }
  11. getImgData(localId) {
  12. window.wx.getLocalImgData({
  13. localId: localId,
  14. success: async (res)=> {
  15. let base64 = res.localData
  16. let localData = base64;
  17. localData = localData.replace(/\r|\n/g,"").replace("data:image/jgp", "data:image/jpeg");
  18. this.isShow = true // 此处把组件显示出来
  19. this.image = localData // image为传入组件内的土拍呢数据
  20. },
  21. fail () {
  22. reject(new Error('getLocalImgData 调用失败'))
  23. }
  24. })
  25. }
  26. afterCropImage(base64){
  27. this.isShow = false // 关闭裁剪组件
  28. this.uploadBase64(base64)
  29. },
  30. uploadBase64(){
  31. // 上传,业务代码这里不做展示了,自定义即可
  32. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/565190
推荐阅读
相关标签
  

闽ICP备14008679号