乐趣区

关于javascript:uniapp-canvas绘图

需要,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 思否写作挑战赛,欢送正在浏览的你也退出。

退出移动版