利用大首圖、小程序碼,以及取到的資訊,透過 Canvas 合併成一張圖。絕大部分參考此篇:小程序分享模块超级详解 (By 你猜我叫啥),真的超級詳解,收穫良多。本篇只簡單描述幾個重要步驟。
canvas.drawImage()
MDN: CanvasRenderingContext2D.drawImage()
給定一張圖片後,可以將圖片讀進來繪製在 canvas 上。
base64 轉圖片
小程序碼生成 API 會給回傳 base64 資料,需要將其轉換為 image 之後,再透過上述方式將其繪製在畫布上。
首先分析 base64 資料,利用 wx.base64ToArrayBuffer()
做一次轉換,再透過小程序的文件管理器 wx.getFileSystemManager()
及 writeFile
方法,將 base64 圖片轉存在本地文件夾 (wx.env.USER_DATA_PATH
) 中。
參考以下程式碼,來源:小程序分享模块超级详解 (By 你猜我叫啥)。
/* -- 作者:你猜我叫啥 链接:https://juejin.im/post/5ca9b058e51d452b0f3346d0 来源:掘金 -- */ var handleBase64Img = function() { //wx.getFileSystemManager 小程序文件管理器 var fsm = wx.getFileSystemManager(); var FILE_NAME = 'base64src'; var base64src = function(base64data) { return new Promise((resolve, reject) => { //解析base64,提取出图片类型: imgtype,解析内容bodyData(去掉data:image/png;base64,以后的内容) var [, imgType, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || []; if (!imgType) { reject(new Error('ERROR_BASE64SRC_PARSE')); } /** *wx.env.USER_DATA_PATH *本地用户文件 *本地用户文件是从 1.7.0 版本开始新增的概念。提供了一个用户文件目录给开发者,开发者对这个目录有完全自由的读写权限。通过 wx.env.USER_DATA_PATH 可以获取到这个目录的路径。 */ var filePath = `${wx.env.USER_DATA_PATH}/${FILE_NAME}.${imgType}`; //按指定写入文件的字符编码encoding,向地址filepath,写入数据data。 fsm.writeFile({ filePath, data: bodyData, encoding: 'base64', success() { resolve(filePath); }, fail() { reject(new Error('ERROR_BASE64SRC_WRITE')); }, }); }); }; return base64src; } var base64src = that.handleBase64Img(); var handleBase64src = base64src(base64data); handleBase64src.then(res => { //res 即为base64 转化为图片后的本地路径,即可在画布上绘制成功 that.ctx.drawImage(res, left, top, width, height); });
保存到相簿中
要讓使用者下載圖片,必須先有訪問相簿的權限。透過 wx.getSetting()
方法取得授權資料,取得之後再透過 wx.saveImageToPhotosAlbum()
及本地暫時生成的 Url 將圖片存下來。
小坑:Canvas 如何隱藏
繪製的時候,因為不希望 Canvas 影響到畫面,因此會將它藏起來,但不可以使用 display: none
,會抓不到元素,一個解法如下:
// wxml <view class="container> <canvas canvas-id='my-canvas'></canvas> <view> // css .container { width: 0px; height: 0px; overflow: hidden; }