微信小程序 自定义图片分享-绘制数据图片以及信息文字

一 、需求

从数据库中读取头像,姓名电话等信息,当分享给女朋友时,每个信息不一样

二、实现方案

1、先将数据库中需要的头像姓名信息读取出来加载到data 数据项中

复制代码
data:{
     firstName:'', // 姓名
      img:'', // 头像
     shareImage:'',// 存储临时图片
}

2、当进入页面时,就产生图片,分享时直接分享 在小程序onLoad函数中实现

css 复制代码
    // 生成分享图片
    generateShareImage() {

        // 进入页面就下载头像到临时地址中
        const imgUrl = app.globalData.base_url +'uploads/lawyer/'+this.data.img
        wx.downloadFile({
            url: imgUrl,
            success: (res) => {
              if (res.statusCode === 200) {

                // 下载成功,获取临时路径
                const tempFilePath = res.tempFilePath;
                console.log("666"+tempFilePath)

                // 开始绘制 注意这里
                this.drawPoster(tempFilePath);
              }
            },
            fail: (err) => {
              console.error('图片下载失败:', err);
            }
        });
    },

    // 绘制海报
    drawPoster(avatarPath){
        // createCanvasContext 绘制方法
        const ctx = wx.createCanvasContext('shareCanvas');

        // 绘制背景图(可以是本地或网络路径)
        const bgImagePath = '/images/sharebg.jpg'; // 替换为你的背景图地址

        // 1. 绘制背景图
        ctx.drawImage(bgImagePath, 0, 0, this.data.canvasWidth, this.data.canvasHeight);

        // 2. 设置字体样式
        ctx.setFontSize(10);
        ctx.setFillStyle('black');

        // 3. 绘制姓名头像
        if(avatarPath){
            ctx.save()
            ctx.arc(40, 30, 11 * 2, 0, 2 * Math.PI) // 圆形边框
            //ctx.strokeStyle = '#1A1A1A' // 设置绘制圆形边框的颜色
            ctx.stroke() // 绘制出圆形,默认为黑色,可通过 ctx.strokeStyle = '#FFFFFF',设置想要的颜色
            ctx.clip()
            ctx.drawImage(avatarPath,  8, 6, 70, 70) // 图像大小
            ctx.restore()
        }

        // ctx.fillText(`${this.data.firstName}`, 100, 50);
        drawMultiLineText(ctx,`${this.data.firstName}`,80,28,50, 14, 14);

       
        drawMultiLineText(ctx,`${this.data.title}`,80,45,50, 14, 10);

       
        // ctx.fillText(`${this.data.mobilePhoneNumber}`, 10, 90);
        drawMultiLineText(ctx,`${this.data.mobilePhoneNumber}`,35,70,100, 14, 10);

        
        // ctx.fillText(`${this.data.email}`,10,110);
        drawMultiLineText(ctx,`${this.data.email}`,35,90,110, 14, 10);

       
        drawMultiLineText(ctx,`${this.data.address_details}`,35,109,90, 16, 10);

        // 5. 绘制完成
        ctx.draw(false, () => {

          // 6. 将 Canvas 导出为临时图片路径
          wx.canvasToTempFilePath({

            canvasId: 'shareCanvas',
            success: (res) => {
              // res.tempFilePath 是生成的临时图片路径
              console.log(this.data.mobilePhoneNumber)
              this.setData({
                shareImage: res.tempFilePath
              });
              // 触发分享
              this.onShareAppMessage();
            },
            fail: (err) => {
              wx.showToast({ title: '生成图片失败', icon: 'none' });
            }
          });
        });
    },
css 复制代码
onLoad(options){
     // 调用绘制方法
    this.generateShareImage()
}

3、分享图片

onShareAppMessage 触发分享

css 复制代码
 onShareAppMessage() {
        return {
            title:'标题',//标题
            path: '/pages/index/index',//路径
            imageUrl: this.data.shareImage//图片
        }
    }
相关推荐
做萤石二次开发的哈哈1 小时前
海康班班通交互一体机技能接入实战:ISAPI透传+OTAP双协议封装,Web/App/小程序教学管理应用一站生成
前端·物联网·小程序·交互·萤石开放平台·蓝海aiot一站式工作台·aiot开发
云迈科技-软件定制开发1 小时前
长沙企业软件开发、App 开发全流程|需求、开发、上线、运维拆解
小程序·app开发
盟道科技1 小时前
电商小程序SKU数据模型设计:SPU、规格组合、库存与价格的工程实践
服务器·小程序·apache
mykj15512 小时前
社交找搭子app小程序找人组局更方便
小程序·app开发·小程序开发·找搭子app
m0_4628038820 小时前
从信息管理视角看「按桌顺序分桌」:云分组优先分组的实现逻辑
微信小程序
爱折腾的编程老炮1 天前
潮玩品牌自建抽盒机小程序——商城 + 抽盒 + 一番赏 + 会员 + 社区,一套代码怎么搭
spring boot·小程序·vue·mybatis·uniapp
新知图书1 天前
第13章 从一句话需求到上线“续费管家”小程序
人工智能·小程序·智能体
数商云企1 天前
2026年陕西软件开发首选数商云企AI微入口小程序定制方案
人工智能·小程序
bug总结2 天前
uniapp 微信小程序分包规范
微信小程序·小程序·uni-app
Quor2 天前
小程序工作室:AI 生成即运行的可视化工作台
人工智能·小程序