当前位置:   article > 正文

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

微信小程序剪裁

前言

        技术支持: wx-cropper 裁剪

        总体思路是:安装完wx-cropper之后就它当成组件使用。在使用页面的地方引入组件就行。上传图片的逻辑不变,在 通过wx.chooseMedia() Api 拿到图片之后传递给子组件,子组件在拿到图片进行裁剪处理等操作之后,在把图片传递给父组件,父组件在拿到处理之后的图片,在进行自己之后的逻辑操作。简单来说就是------父组件上传图片-->子组件拿到图片进行处理-->处理的图片给父组件-->自己的逻辑操作

一. 引入wx-cropper

npm i @dw/wx-cropper

安装wx-cropper之后构建npm

二. 在需要使用的页面上引入

  1. {
  2. "usingComponents": {
  3. "my-cropper": "@dw/wx-cropper"
  4. }
  5. }

 三. 示例

        1. wxml代码

  1. <button catchtap="handleuploadimg">上传图片</button>
  2. <block wx:for="{{ fileList }}" wx:key="*this">
  3. <image src="{{ item }}" mode=""/>
  4. </block>
  5. <view class="layers" wx:if="{{cjtp}}">
  6. <my-cropper bind:close="hideCut" cutRatio="{{cutRatio}}" imageSrc="{{imageSrc}}" />
  7. </view>

        2. wxss样式 

                这个是需要把裁剪功能组件覆盖到当前页面上

  1. /* pages/upload/upload.wxss */
  2. .layers{
  3. width: 100vw;
  4. height: 100vh;
  5. background-color: #00000080;
  6. position: absolute;
  7. top: 0;
  8. left: 0;
  9. right: 0;
  10. bottom: 0;
  11. z-index: 10000000;
  12. }

 

        3. js代码

                当选择完图片时,显示裁剪功能,以及把上传的图片传给组件。当用户裁剪完图片之后,会通过组件getImageInfo方法处理图片之后,在通过子组件向父组件传值的方法,把裁剪处理完之后图片传递给父组件 _this.triggerEvent('close', img);

  1. // pages/upload/upload.js
  2. Page({
  3. /**
  4. * 页面的初始数据
  5. */
  6. data: {
  7. fileList: [], //上传图片集合
  8. base64List: [], //base64集合
  9. delFileArr:[], //删除的附件集合
  10. imgWidthslot: 0,
  11. imgHeightslot: 0,
  12. //裁剪信息
  13. cjtp: false, //裁剪信息 这个控制裁剪功能的现实和隐藏
  14. cutRatio:0.75, //裁剪比例
  15. imageSrc:'', //个人图片
  16. },
  17. /**
  18. * 生命周期函数--监听页面加载
  19. */
  20. onLoad(options) {
  21. },
  22. // 上传图片
  23. handleuploadimg() {
  24. wx.chooseMedia({
  25. count: 1,
  26. mediaType: ['image'],
  27. sourceType: ['camera', 'album'],
  28. success: (res) => {
  29. // this.setData({
  30. // fileList: res.tempFiles
  31. // })
  32. var tempFilePaths = res.tempFiles;
  33. for (let i in tempFilePaths) {
  34. let imagePath = tempFilePaths[i].tempFilePath; //原图的路径
  35. let size = tempFilePaths[i].size; //原图大小
  36. //this.setData({
  37. // imageSrc:imagePath,
  38. //cjtp:true,
  39. //})
  40. //判断是否需要压缩
  41. if(size > this.data.size){
  42. this.setCanvasLoad(imagePath);
  43. }else{
  44. this.setData({
  45. imageSrc:imagePath,
  46. cjtp:true,
  47. })
  48. }
  49. }
  50. }
  51. })
  52. },
  53. // 压缩图片
  54. setCanvasLoad(obj){
  55. let imagePath = obj; //原图的路径
  56. const ctx = wx.createCanvasContext('myfirstCanvasSlot',this);
  57. let that = this;
  58. wx.showLoading({
  59. title: '图片压缩中...',
  60. mask: true
  61. }) //不需要你可以删掉
  62. // console.log(imagePath,'原图的路径')
  63. wx.getImageInfo({
  64. src:imagePath,
  65. success:(res)=>{
  66. // console.log(res,'获取图片的属性')
  67. // 图片原始尺寸
  68. let originWidth = res.width;
  69. let originHeight = res.height;
  70. // 最大尺寸限制,可通过设置宽高来实现图片压缩程度
  71. let maxWidth = 1920,
  72. maxHeight = 800;
  73. // 目标尺寸
  74. let targetWidth = originWidth,
  75. targetHeight = originHeight;
  76. // 图片尺寸超过200x150的限制
  77. if(originWidth > maxWidth || originHeight > maxHeight) {
  78. if(originWidth / originHeight > maxWidth / maxHeight) {
  79. // 更宽,按照宽度限定尺寸
  80. targetWidth = maxWidth;
  81. targetHeight = Math.round(maxWidth * (originHeight / originWidth));
  82. } else {
  83. targetHeight = maxHeight;
  84. targetWidth = Math.round(maxHeight * (originWidth / originHeight));
  85. }
  86. }
  87. // canvas对图片进行缩放
  88. this.setData({
  89. imgWidthslot: targetWidth,
  90. imgHeightslot: targetHeight
  91. })
  92. // 压缩图片(绘制图像到画布)
  93. ctx.drawImage(imagePath,0,0,targetWidth,targetHeight);
  94. console.log(this.data.imgWidth)
  95. ctx.draw(false, ()=>{
  96. setTimeout(()=>{
  97. // canvas导出为图片路径
  98. wx.canvasToTempFilePath({
  99. canvasId: 'myfirstCanvasSlot',
  100. fileType: 'png', //支持jpg或png
  101. quality: 0.92, //图片质量
  102. success:(res1)=> {
  103. wx.hideLoading();
  104. // console.log(targetWidth,targetHeight,'targetHeight')
  105. let compressedPath = res1.tempFilePath;
  106. //将图片转化为base64
  107. this.setData({
  108. imageSrc:compressedPath,
  109. cjtp:true,
  110. })
  111. },
  112. fail:(res1)=>{
  113. // console.log('图片压缩失败',res)
  114. wx.hideLoading()
  115. wx.showModal({
  116. content: '图片压缩失败',
  117. showCancel:false
  118. })
  119. }
  120. },that)
  121. },200)
  122. })
  123. },
  124. fail: (res) => {
  125. wx.hideLoading()
  126. // console.log(res,'获取图片的属性失败');
  127. wx.showModal({
  128. content: '图片压缩失败',
  129. showCancel:false
  130. })
  131. }
  132. })
  133. },
  134. //关闭裁剪
  135. hideCut(e){
  136. let obj = e.detail;
  137. let fileList = this.data.fileList;
  138. let base64List = this.data.base64List;
  139. //是否已经截取
  140. if(obj){
  141. console.log('------obj', obj)
  142. wx.showLoading({
  143. title: '裁剪中',
  144. })
  145. fileList = [ obj.path ]
  146. wx.getFileSystemManager().readFile({
  147. filePath: obj.path,
  148. encoding: "base64",
  149. success: (res) => {
  150. wx.hideLoading(); //不需要你可以删掉
  151. base64List = [res.data]
  152. this.setData({
  153. base64List: base64List,
  154. fileList: fileList,
  155. })
  156. console.log('-----res-----', this.data.base64List, this.data.fileList)
  157. },
  158. fail: (res) => {
  159. wx.hideLoading(); //不需要你可以删掉
  160. wx.showModal({
  161. content: '图片裁剪失败',
  162. showCancel:false
  163. })
  164. }
  165. })
  166. }
  167. this.setData({
  168. cjtp:false,
  169. })
  170. },
  171. /**
  172. * 生命周期函数--监听页面初次渲染完成
  173. */
  174. onReady() {
  175. },
  176. /**
  177. * 生命周期函数--监听页面显示
  178. */
  179. onShow() {
  180. },
  181. /**
  182. * 生命周期函数--监听页面隐藏
  183. */
  184. onHide() {
  185. },
  186. /**
  187. * 生命周期函数--监听页面卸载
  188. */
  189. onUnload() {
  190. },
  191. /**
  192. * 页面相关事件处理函数--监听用户下拉动作
  193. */
  194. onPullDownRefresh() {
  195. },
  196. /**
  197. * 页面上拉触底事件的处理函数
  198. */
  199. onReachBottom() {
  200. },
  201. /**
  202. * 用户点击右上角分享
  203. */
  204. onShareAppMessage() {
  205. }
  206. })

父组件会通过hideCut方法 来拿到子组件传递过来的图片,然后在回显到页面上。 

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

闽ICP备14008679号