本篇文章給大家了解一下微信小程序頁面中實現的保存圖片,有需要的朋友可以參考一下,希望對你們有幫助。

背景
在小程序的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"; //這里是圖片的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 數據
},
});
};2、小程序監聽postmessage拿到圖片base64數據。
// wxml
<
web - view src = "http://www.chuchur.com/save-image"
bindmessage = "getMessage" > < /web-view>
// js
Page({
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>
// js
Page({
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();
}
}))





