ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

canvas图片文字合成(小程序分享)

2022-02-28 18:02:17  阅读:193  来源: 互联网

标签:canvas resolve return res 合成 ctx width var 分享


写这个的原因是在写一个小程序的需求的时候用到了,在此记录一下。
需求需要实现的点就是:在分享小程序个人资料页面的时候将个人信息和个人头像进行重叠放在一起然后分享出去,大概样子如下:
在这里插入图片描述
不同的用户头像不同,个人信息不同。写一个函数传入这两个信息,动态合成一张图片,然后再进行分享。
实现的完整代码如下:

// 图片文字合成
// 绘制文字
function canvasWraptitleText(ctx, text, x, y, maxWidth, lineHeight, maxRowNum,font,color) {
    return new Promise((resolve, reject) => {
        if (typeof text != 'string' || typeof x != 'number' || typeof y != 'number') {
            return;
        }
        ctx.font = font; //绘制文字的字号和大小
        ctx.setFillStyle(color) //字体颜色
        // 字符分隔为数组
        var arrText = text.split('');
        var line = '';
        var rowNum = 1;
        for (var n = 0; n < arrText.length; n++) {
            var testLine = line + arrText[n];
            var metrics = ctx.measureText(testLine);
            var testWidth = metrics.width;
            if (testWidth > maxWidth && n > 0) {
                if (rowNum >= maxRowNum) {
                    var arrLine = testLine.split('')
                    // arrLine.splice(-9)
                    var newTestLine = arrLine.join("")
                    newTestLine += "..."
                    canvas.fillText(newTestLine, x, y);
                    resolve();
                    return
                }
                canvas.fillText(line, x, y);
                line = arrText[n];
                y += lineHeight;
                rowNum += 1
            } else {
                line = testLine;
            }
        }
        ctx.fillText(line, x, y);
        resolve();
    })
}
// 获得合成后的图片路径
function getCanvasToTempFilePath(canvasData,id){
    return new Promise((resolve, reject) => {
        wx.canvasToTempFilePath({
            canvasId: id,
            success:(res) =>{
                resolve(res.tempFilePath)
            }
        })
    })
}
// 合成前获取图片地址
function downloadFile(img) {
    return new Promise((resolve, reject) => {
        // 如果是腾讯云存储,下载前做一下裁剪,加快下载速度
        if(img.indexOf('pubser-res.xxx.com/')>-1){
            img += '?imageMogr2/scrop/300x240'
        }
        wx.downloadFile({    //下载图片
            url: img,
            success(res){
                if (res.statusCode === 200) {
                    return resolve(res.tempFilePath)
                } else {
                    return reject()
                }
            },
            complete(err){
                return reject('')
            }
        })
    })
}
// 获取图片信息
function getImgInfo(img) {
    return new Promise((resolve, reject) => {
        wx.getImageInfo({
            src: img,
            success(res){
                if (res.width) {
                    return resolve(res.width)
                }
            },
            complete(err){
                return reject('')
            }
        })
    })
}
 /**
  * @description: 图片文字合成
  * @param {id} 必填 canvas的id
  * @param {canvasData} 可选 要合成的文字
  * @param {bgImg} 可选 要合成的图片
  */
function createShareImg(id, canvasData, bgImg){
    return new Promise(async (resolve, reject) => {
        // 按照宽度为300 宽高比为5:4绘制
        // var v = wx.getSystemInfoSync().windowWidth / 750
        var width = 132;
        var height = 105.6;
        var ctx = wx.createCanvasContext(id);
        ctx.fillStyle = 'rgba(255,255,255,1)';
        ctx.fillRect(0,0,width,height);
        try{
            // 绘制头像
            const bgImg1 =  await downloadFile(bgImg)
            const realWidth = await getImgInfo(bgImg1)
            const realHeight = realWidth * 0.8
            ctx.drawImage(bgImg1,0,0,realWidth, realHeight,0,0,width, height)
            // 绘制渐变背景
            const bgImg2 = await downloadFile('https://file.zastatic.com/images/common-cms/it/20220222/1645523216476_180077.png')
            ctx.drawImage(bgImg2, 0,0,600,272, 0,0,width,height)
            // 绘制文字
            let x = width * 0.05
            let y = height * 0.95; // 从下往上排
            for (const key in canvasData) {
                canvasWraptitleText(ctx,canvasData[key], x,y,200,30,5,'400 9px PingFangSC','#FFFFFF');
                y-=14;
            }
            ctx.save();
            // 完成
            ctx.draw(true, ()=>{
                getCanvasToTempFilePath(canvasData,id).then((DATA)=>{
                    resolve(DATA)
                })
            })
        }catch(err){
            resolve('')
        }
    })
}
export {
    createShareImg
}

标签:canvas,resolve,return,res,合成,ctx,width,var,分享
来源: https://blog.csdn.net/Sunday97/article/details/123182819

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有