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

之前的文章《浅析微信小程序和web之间的交互(代码分享)》中,给大家了解一下微信小程序和web之间的交互。下面本篇文章给大家了解一下微信小程序页面中实现的保存图片,有需要的朋友可以参考一下,希望对你们有帮助。

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

背景

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

更多web和小程序的交互,请看这里

解决思路

先加载微信js-sdk


登录后复制

分三步

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

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

登录后复制

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

// wxml // jsPage({    data: {        imageData: null    }    getMessage(e) {        this.setData({            imageData: e.detail.data[0].imgData        })    }})

登录后复制

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

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

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

登录后复制

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

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

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

登录后复制

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

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

getMessage: function(e) {    if (e.type === 'message' && e.detail && e.detail.data && e.detail.data.length > 0) {        e.detail.data.forEach(function(dataItem) {            if (dataItem.type === 'qbreport' && dataItem.key) {                // todo: yourFn(dataItem.key)            }        })    }}

登录后复制

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

function() {    // 此处省略    wx.miniProgram.postMessage({        data: {            xxx: 'aaa'        }    })    wx.miniProgram.navigateBack({        delta: 1    }) //注意这里.}

登录后复制

完整的代码如下:

html端代码:

webchat webview save image
                             function saveImage() { let img = new Image() img.src = 'xxxx' //这里是图片的src img.crossOrigin = 'anonymous' //The opeartaion is insecure , 其他跨域问题自行代理解决. img.onload = function() { let canvas = document.createElement('canvas') canvas.width = img.width canvas.height = img.height let ctx = canvas.getContext('2d') ctx.drawImage(this, 0, 0) let imgBase64Data = canvas.toDataURL('image/jpeg', 1) //这里就拿到了base64 wx.miniProgram.postMessage({ data: { imgData: imgBase64Data // 刚才拿到的base64 数据 } }) wx.miniProgram.navigateBack({ delta: 1 }) //注意这里. } }     

登录后复制

小程序端代码:

// wxml // jsPage({    getMessage(e) {        let img = e.detail.data[0].imgData        wx.getFileSystemManager().writeFile({            filePath: wx.env.USER_DATA_PATH + '/qrcode.jpeg', //这里先把文件写到临时目录里.            data: img.slice(22), //注意这里            encoding: 'base64',            success: res => {                console.log('success')                wx.saveImageToPhotosAlbum({                    filePath: wx.env.USER_DATA_PATH + '/qrcode.jpeg', //这是把临时文件 保存到 相册, 收工                    success: res => {                        wx.showToast({                            title: '保存成功!'                        })                    },                    fail: error => {                        console.log(error)                    }                })            },            fail: error => {                console.log(error)            }        })    }})

登录后复制

其它相关

保存远程图片

  wx.showLoading({      title: "正在下载图片... ",      mask: !1  })  wx.downloadFile({  url: '填写一个远程的图片链接',  success: function(t) {      wx.showLoading({          title: "正在保存图片",          mask: !1      })      wx.saveImageToPhotosAlbum({          filePath: t.tempFilePath,          success: function() {              wx.showModal({                  title: "自定义提示信息",                  content: "保存成功",                  showCancel: !1              });          },          fail: function(t) {              wx.showModal({                  title: "图片保存失败",                  content: t.errMsg,                  showCancel: !1              });          },          complete: function(t) {              wx.hideLoading();          }      });  },  fail: function(t) {      wx.showModal({          title: "图片下载失败",          content: t.errMsg,          showCancel: !1      });  },  complete: function(t) {      wx.hideLoading();  }  }))

登录后复制

推荐学习:SVG视频教程

以上就是深入解析微信小程序页面中实现的保存图片(附代码)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2907472.html

(0)
上一篇 2025年3月11日 02:58:47
下一篇 2025年3月11日 02:58:58

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 你值得了解的HTTP缓存机制(代码详解)

    之前的文章《深入解析vue中路由切换白屏的问题(附代码)》中,给大家了解了vue中路由切换白屏的问题。下面本篇文章给大家了解HTTP缓存机制详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。 Web缓存大致可以分为:数据库…

    2025年3月11日 编程技术
    200
  • 深入解析asp.net中mvc4自定义404页面(分享)

    之前的文章《一文讲解JS中ES6代理Proxy用法(代码分享)》中,给大家了解了JS中ES6代理Proxy用法。下面本篇文章给大家了解asp.net中mvc4自定义404页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。 …

    2025年3月11日
    200
  • 手把手教你使用给站点开启https和http2(附代码)

    之前的文章《浅析nginx的安装与使用(收藏)》中,给大家介绍了解了nginx的安装与使用。下面本篇文章给大家介绍怎么给站点开启https和http2,我们一起看看怎么做。 本篇文章主要介绍了如何给站点开启https和http2 本篇文章主…

    2025年3月11日
    200
  • html5 app开发框架有哪些

    html5 app开发框架有:1、jquery mobile;2、bootstrap;3、ionic;4、Mobile Angular UI;5、Intel XDK;6、Appcelerator Titanium;7、PhoneGap等等。…

    2025年3月11日 编程技术
    200
  • CSS3+Js实现响应式导航条方法

    本文介绍css3+js实现响应式导航条方法 今天制作了一个响应式导航条,能够自动随着不同的屏幕分辨率或浏览器窗口大小的不同而改变导航条的样式,这里主要用到的就是CSS3的Media Query。具体可以查看浅谈响应式布局这篇文章,这里就不花…

    2025年3月11日
    200
  • 通过html/css设置超链接字体颜色

    超链接字体颜色设置是通过css来设置,a链接的颜色设置常用的有以下两种,1、超链接a的初始状态颜色,2、超链接字体的鼠标滑过颜色,还有两种病不常用:3、超链接字体的已访问颜色 超链接字体颜色设置是通过css来设置,a链接的颜色设置常用的有以…

    编程技术 2025年3月11日
    200
  • canvas如何绘制钟表的方法_html5教程技巧

    这篇文章主要介绍了html5中的canvas如何绘制钟表的方法的相关资料,小编觉得html真的是越来越强大的,现在分享给大家,也给大家做个参考。对html的小伙伴们可以一起跟随小编过来看看吧 本文介绍了canvas如何绘制钟表的方法,分享给…

    2025年3月11日
    200
  • 详解CSS和HTML自定义checkbox效果

    checkbox应该是一个比较常用的html功能了,不过浏览器自带的checkbox往往样式不怎么好看,而且不同浏览器效果也不一样。出于美化和统一视觉效果的需求,checkbox的自定义就被提出来了。本文主要给大家分享css+html自定义…

    编程技术 2025年3月11日
    200
  • 实例详解HTML、CSS动态背景登录页面的实现

    登录页面有一个背景,会大大增加人们的视觉享受,但是登录页面除了静态页面还有动态页面登录,本文主要介绍了html+css实现动态背景登录页面的相关资料,需要的朋友可以参考下,希望能帮助到大家。 1. 实现背景图片的动态变换 首先在HTML页面…

    2025年3月11日
    200
  • HTML5中的picture元素响应式处理图片方法

    所谓的响应式设计,是指在不同的屏幕分辨率,不同的像素密度比,不同宽度的终端设备中,网页布局可以自适应的调整。响应式设计的本意是使原本pc上的网站兼容移动终端,大部分响应式网页是通过媒体查询,加载不同样式的css文件实现的。这样的弹性化布局使…

    2025年3月11日 编程技术
    200

发表回复

登录后才能评论