深入解析微信小程序页面中实现的保存图片(附代码)

 7334

本篇文章给大家了解一下微信小程序页面中实现的保存图片,有需要的朋友可以参考一下,希望对你们有帮助。


深入解析微信小程序页面中实现的保存图片(附代码)


背景

在小程序的webview里保存图片。因为微信的js-sdk没有提供saveImageToPhotosAlbum方法

解决思路

先加载微信js-sdk

  1. <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

分三步

1、html端把图片转为base64,然后通过postmessage传递给小程序

  1. let img = new Image();
  2. img.src = "xxxx"; //这里是图片的src
  3. img.crossOrigin = "anonymous"; //The opeartaion is insecure . 其它跨域的问题 自行代理解决
  4. img.onload = function () {
  5.   let canvas = document.createElement("canvas");
  6.   canvas.width = img.width;
  7.   canvas.height = img.height;
  8.   let ctx = canvas.getContext("2d");
  9.   ctx.drawImage(this, 0, 0);
  10.   let imgBase64Data = canvas.toDataURL("image/jpeg", 1); //这里就拿到了base64
  11.   wx.miniProgram.postMessage({
  12.     data: {
  13.       imgData: imgBase64Data, // 刚才拿到的base64 数据
  14.     },
  15.   });
  16. };


2、小程序监听postmessage拿到图片base64数据。

  1. // wxml
  2. <
  3. web - view src = "http://www.chuchur.com/save-image"
  4. bindmessage = "getMessage" > < /web-view>
  5.  
  6. // js
  7. Page({
  8.     data: {
  9.         imageData: null
  10.     }
  11.     getMessage(e) {
  12.         this.setData({
  13.             imageData: e.detail.data[0].imgData
  14.         })
  15.     }
  16. })


3. 保存图片到相册(在小程序里)

因为拿到是base64图片数据,首先要把它存为图片文件。

  1. wx.getFileSystemManager().writeFile({
  2.   filePath: wx.env.USER_DATA_PATH + "/qrcode.png", //这里先把文件写到临时目录里.
  3.   data: this.data.imageData.slice(22), // 注意这里
  4.   encoding: "base64",
  5.   success: (res) => {
  6.     console.log("success");
  7.   },
  8.   fail: (error) => {
  9.     console.log(error);
  10.   },
  11. });

getFileSystemManager的writeFile写入的base64是不包含图片的头字节的。所以要干掉data:image/jpeg;base64,等字符

有了文件路径就可以保存到相册了

  1. wx.saveImageToPhotosAlbum({
  2.   filePath: wx.env.USER_DATA_PATH + "/qrcode.png", //这是把临时文件 保存到 相册, 收工
  3.   success: (res) => {
  4.     wx.showToast({
  5.       title: "保存成功!",
  6.     });
  7.   },
  8.   fail: (error) => {
  9.     console.log(error);
  10.   },
  11. });


没有接收到?不是实时触发?

文档发现虽然h5中的postMessage会马上提交信息,但是小程序并不会马上受理,在小程序webview上的监听函数,只会在特定时机触发并收到消息:也就是postMessage所有的消息都只能等得分享或webview的生命周期结束才会被触发。他是一个消息队列:

  1. getMessage: function(e) {
  2.     if (e.type === 'message' && e.detail && e.detail.data && e.detail.data.length > 0) {
  3.         e.detail.data.forEach(function(dataItem) {
  4.             if (dataItem.type === 'qbreport' && dataItem.key) {
  5.                 // todo: yourFn(dataItem.key)
  6.             }
  7.         })
  8.     } 
  9. }

所以,我们在执行保存的时候可以立马触发它的返回事件。

  1. function() {
  2.     // 此处省略
  3.     wx.miniProgram.postMessage({
  4.         data: {
  5.             xxx: 'aaa'
  6.         }
  7.     })
  8.     wx.miniProgram.navigateBack({
  9.         delta: 1
  10.     }) //注意这里.
  11. }


完整的代码如下:

html端代码:

  1. <html>
  2. <title>webchat webview save image</title>
  3. <header>
  4.  
  5.     <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
  6.     </hearder>
  7.  
  8.     <body>
  9.         <button id="saveImage" onclick="saveImage">下载图片</button>
  10.         <script>
  11.             function saveImage() {
  12.                 let img = new Image()
  13.                 img.src = 'xxxx' //这里是图片的src
  14.                 img.crossOrigin = 'anonymous' //The opeartaion is insecure , 其他跨域问题自行代理解决.
  15.                 img.onload = function() {
  16.                     let canvas = document.createElement('canvas')
  17.                     canvas.width = img.width
  18.                     canvas.height = img.height
  19.                     let ctx = canvas.getContext('2d')
  20.                     ctx.drawImage(this, 0, 0)
  21.                     let imgBase64Data = canvas.toDataURL('image/jpeg', 1) //这里就拿到了base64
  22.  
  23.                     wx.miniProgram.postMessage({
  24.                         data: {
  25.                             imgData: imgBase64Data // 刚才拿到的base64 数据
  26.                         }
  27.                     })
  28.  
  29.                     wx.miniProgram.navigateBack({
  30.                         delta: 1
  31.                     }) //注意这里.
  32.                 }
  33.             }
  34.         </script>
  35.     </body>
  36.  
  37. </html>

小程序端代码:

  1. // wxml
  2. <
  3. web - view src = "http://www.chuchur.com/save-image"
  4. bindmessage = "getMessage" > < /web-view>
  5.  
  6. // js
  7. Page({
  8.  
  9.     getMessage(e) {
  10.  
  11.         let img = e.detail.data[0].imgData
  12.  
  13.         wx.getFileSystemManager().writeFile({
  14.             filePath: wx.env.USER_DATA_PATH + '/qrcode.jpeg', //这里先把文件写到临时目录里.
  15.             data: img.slice(22), //注意这里
  16.             encoding: 'base64',
  17.             success: res => {
  18.                 console.log('success')
  19.                 wx.saveImageToPhotosAlbum({
  20.                     filePath: wx.env.USER_DATA_PATH + '/qrcode.jpeg', //这是把临时文件 保存到 相册, 收工
  21.                     success: res => {
  22.                         wx.showToast({
  23.                             title: '保存成功!'
  24.                         })
  25.                     },
  26.                     fail: error => {
  27.                         console.log(error)
  28.                     }
  29.                 })
  30.             },
  31.             fail: error => {
  32.                 console.log(error)
  33.             }
  34.         })
  35.     }
  36. })


其它相关

保存远程图片

  1. wx.showLoading({
  2.     title: "正在下载图片... ",
  3.     mask: !1
  4. })
  5.  
  6. wx.downloadFile({
  7. url: '填写一个远程的图片链接',
  8. success: function(t) {
  9.  
  10.     wx.showLoading({
  11.         title: "正在保存图片",
  12.         mask: !1
  13.     })
  14.     wx.saveImageToPhotosAlbum({
  15.         filePath: t.tempFilePath,
  16.         success: function() {
  17.             wx.showModal({
  18.                 title: "自定义提示信息",
  19.                 content: "保存成功",
  20.                 showCancel: !1
  21.             });
  22.         },
  23.         fail: function(t) {
  24.             wx.showModal({
  25.                 title: "图片保存失败",
  26.                 content: t.errMsg,
  27.                 showCancel: !1
  28.             });
  29.         },
  30.         complete: function(t) {
  31.             wx.hideLoading();
  32.         }
  33.     });
  34.  
  35. },
  36. fail: function(t) {
  37.     wx.showModal({
  38.         title: "图片下载失败",
  39.         content: t.errMsg,
  40.         showCancel: !1
  41.     });
  42. },
  43. complete: function(t) {
  44.     wx.hideLoading();
  45. }
  46. }))


本文网址:https://www.zztuku.com/detail-9076.html
站长图库 - 深入解析微信小程序页面中实现的保存图片(附代码)
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐