[微信小程序] 製作分享海報


利用大首圖、小程序碼,以及取到的資訊,透過 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;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *