• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 深入解析微信小程序页面中实现的保存图片(附代码)

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

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了微信小程序,小程序保存图片等相关知识,希望对您有所帮助

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


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


背景

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

解决思路

先加载微信js-sdk

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

分三步

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<web - view src = "http://www.chuchur.com/save-image"bindmessage = "getMessage" > < /web-view> // 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端代码:

<html><title>webchat webview save image</title><header>     <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>    </hearder>     <body>        <button id="saveImage" onclick="saveImage">下载图片</button>        <script>            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                    }) //注意这里.                }            }        </script>    </body> </html>

小程序端代码:

// wxml<web - view src = "http://www.chuchur.com/save-image"bindmessage = "getMessage" > < /web-view> // 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();}}))


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 手把手教你在微信小程序中使用canvas绘制天气折线图(附代码)
  • 微信小程序页面向下滚动时tab栏固定页面顶部实例讲解
  • uniapp实现微信小程序全局分享的示例代码
  • 浅析微信小程序中自定义组件的方法
  • 微信小程序发布新版本时自动提示用户更新的方法
  • 微信小程序wx.request使用POST请求时后端无法获取数据解决办法
  • 微信小程序如何获取到openid和session_key
  • PHP微信小程序解包过程实例详解
  • 微信小程序中的button按钮宽度设置无效怎么办
  • 微信小程序反编译提取源代码方法

相关文章

  • 2022-04-29详解关于laravel自动路由
  • 2022-04-29Photoshop技巧:CC版本的最全总结
  • 2022-04-29PHP之array_unique实现二维数组去重
  • 2022-04-29免费网站目录提交网址收集
  • 2022-04-29为什么不建议使用@import引入css
  • 2022-04-29PHP使用PHPAnalysis提取关键字中文分词的方法是什么
  • 2022-04-29vue怎样解决axios请求出现前端跨域问题(实例详解)
  • 2022-04-29大文件怎么快速上传?来看看我的实现方法!
  • 2022-04-29聊聊laravel怎么快速生成 Services?
  • 2022-04-29PS打造动感抽象炫光舞者海报效果制作教程

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Photoshop鼠绘蓝色进度圈
    • jQuery怎么实现鼠标经过改变背景色
    • 帝国CMS封装的ajax加载信息框架代码
    • Vue 手势组件教程
    • 如何使用PhpSpreadsheet导入导出Excel
    • 原生小程序如何封装请求,优雅地调用接口?
    • jQuery checkbox不可选怎么实现
    • PHP如何接入微信支付分(代码示例)
    • 帝国cms更换php7环境后台空白
    • 实现在dedecms模板中调用wordpress的文章方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有