需要,uniapp微信小程序将页面某一部分保留为图片能够分享,下载。实现这一性能须要应用canvas绘图,背景图为网络图片,两头有个原型的二维码,图片格式为base64,还有一些其余的文字。
最重要的是:无论是网络图片还是base64格局的,拿到一个长期地址!!!办法参考此文章
注:base64能够间接canvas绘制,然而真机不显示!!!模拟器失常!

//绘制canvas <canvas style="width: 280px;height:380px" canvas-id="activityCode" ></canvas>//上面两个办法是将base64图片转换成长期地址function removeSave(FILE_BASE_NAME = 'tmp_base64src', format = 'jpg') {    return new Promise((resolve) => {        // 把文件删除后再写进,避免超过最大范畴而无奈写入        const fsm = uni.getFileSystemManager(); //文件管理器        const FILE_BASE_NAME = 'tmp_base64src';        const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;        fsm.unlink({            filePath: filePath,            success(res) {                console.log('文件删除胜利');                resolve(true);            },            fail(e) {                console.log('readdir文件删除失败:', e);                resolve(true);            }        });    })}function base64ToSave(base64data: any, FILE_BASE_NAME = 'tmp_base64src') {    const fsm = uni.getFileSystemManager();    return new Promise(async (resolve, reject) => {        //format这个跟base64数据的结尾对应        const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];        if (!format) {            reject(new Error('ERROR_BASE64SRC_PARSE'));        }        await removeSave(FILE_BASE_NAME, format);        const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;        //const buffer = wx.base64ToArrayBuffer(bodyData);        fsm.writeFile({            filePath,            data: bodyData,            //data: base64data.split(";base64,")[1],            encoding: 'base64',            success() {                resolve(filePath);            },            fail() {                reject(new Error('ERROR_BASE64SRC_WRITE'));            },        });    });}//开始绘制//1.背景网络图片function drawCanvas() {    const ctx = uni.createCanvasContext('activityCode')    uni.getImageInfo({        src: '****',        success:res=>{              //背景图            ctx.drawImage(res.path, 0, 0, 140, 190);   //插入图片            //绘制文案            ctx.setFontSize(9)            ctx.fillStyle='#FFFFFF'            ctx.setTextAlign('center')            ctx.fillText('***', 70, 40)            //绘制一个原型的图片            circleImg(ctx)            ctx.draw()        },        fail:res=>{            console.log(`缓存失败:${res.errMsg}`);            }    })    }//2.绘制圆形图片function circleImg(ctx) {    ctx.beginPath()    ctx.arc(70, 100, 34, 0, 2 * Math.PI)    ctx.setFillStyle('#ffffff')    ctx.fill()    ctx.clip()    //url就是上方保留的base64长期地址    ctx.drawImage(url, 40, 70, 60, 60);    }//保留图片function saveImg() {    uni.canvasToTempFilePath({        canvasId: 'activityCode',        success: function(res) {            uni.saveImageToPhotosAlbum({                filePath: res.tempFilePath,                success: function () {                    uni.showToast({                        title: '保留胜利',                        icon: 'success'                    })                },                fail: function () {                    uni.showToast({                        title: '保留失败',                        icon: 'none'                    })                }            })        }     })}

注:保留图片的时候最好不要写尺寸,否则会影响生成图片的清晰度!
效果图:

本文参加了SegmentFault 思否写作挑战赛,欢送正在浏览的你也退出。