微信小程序-名片生成

1.生成小程序码

调用后台接口返回base64格式的小程序码,需要将其转成临时图片

js 复制代码
const _this = this;
console.log(this);
uni.showLoading({
        title:'名片生成中',
        mask:false,
})
// this.getImgSize();
getUnlimitedQRCode({
        path: 'subpackage/detail/detail',
        width: 280,
        isHyaline: true, // 默认是false,是否需要透明底色,为 true 时,生成透明底色的小程序
        scene: 'id=' + this.record.id
}).then(res => {
        _this.qrcode = res.data;
        let imgPath = wx.env.USER_DATA_PATH + '/index' + 'qrcode' + '.png';
        let imageData = res.data.replace(/^data:image\/\w+;base64,/, "");
        let fs = wx.getFileSystemManager();
        fs.writeFileSync(imgPath, imageData, "base64");
        console.log(imgPath, 'imgPath-----')
        _this.qrcode = imgPath;
        _this.$nextTick(function() {
                _this.creatCanvas(this.record);
        })
})

2. canvas图片绘制

creatCanvas方法

js 复制代码
creatCanvas(record) { //绘制成canvas
    let _this = this;

    let ctx = uni.createCanvasContext('myCanvas', this);
    // ctx.setFillStyle('#fff');
    // ctx.fillRect(0, 0, 312, 610);
    ctx.drawImage(this.canvasBg, 0, 0, 312, 610); //背景
    // ctx.setFillStyle('#fff');
    // ctx.fillRect(230, 512, 60, 60);
    ctx.drawImage(this.qrcode, 230, 512, 60, 60); //二维码
    // 绘制名字

    // 保存当前状态
    ctx.save()
    ctx.setFontSize(16);
    ctx.setFillStyle('#141B24');
    ctx.setTextAlign('left');
    const personName = record.personName && record.personName.length > 8 ? (record.personName.substring(0, 8) + '...') : record.personName;
    ctx.fillText(personName || '--', 72, 46);
    // 恢复状态
    ctx.restore()
    // 绘制详情
    this.drawerInfo(ctx, record.job, 280, 110);
    this.drawerInfo(ctx, record.orgName, 280, 155);
    this.drawerInfo(ctx, record.regionName, 280, 200);
    this.drawerInfo(ctx, record.categoryName, 280, 248);
    this.drawerInfo(ctx, record.phoneNum, 280, 298);
    this.drawerInfo(ctx, record.infoContactor, 280, 344);
    this.drawerInfo(ctx, record.remark, 280, 390);
    this.drawerInfo(ctx, record.address, 280, 438);
    this.drawerInfo(ctx, record.baseInfo, 280, 484);
    this.drawWatermark(ctx); // 生成水印
    ctx.draw(true, () => {
            setTimeout(() => {
                    uni.canvasToTempFilePath({
                            canvasId: 'myCanvas',
                            success: (res) => {
                                    _this.isShowShareImg = true;
                                    _this.showShareImg = res.tempFilePath;
                                    console.log(res.tempFilePath);
                            },
                            fail: () => {
                                    uni.showToast({
                                            title: '生成失败!',
                                            icon: "none"
                                    })
                            },
                            complete: () => {
                                    uni.hideLoading();
                                    _this.loading = false;
                            }
                    }, _this);
            }, 300);
    });
}

水印生成

js 复制代码
drawWatermark(ctx) {
  const text = storage.get(constant.name) + ' ' + storage.get(constant.phonenumber)
  // 清除画布


  // 设置文字样式
  ctx.setFontSize(12)
  ctx.setFillStyle('rgba(0, 0, 0, 0.08)');

  // 计算文字宽度
  const textMetrics = ctx.measureText(text)
  const textWidth = textMetrics.width

  // 计算水印绘制范围,确保边缘也能覆盖
  const drawWidth = 312 + 140
  const drawHeight = 460

  // 循环绘制水印
  for (let x = -textWidth; x < drawWidth; x += 170) {
    for (let y = 0; y < drawHeight; y += 150) {
      // 保存当前状态
      ctx.save()

      // 移动到绘制位置
      ctx.translate(x, y)

      // 旋转文字
      ctx.rotate(-45 * Math.PI / 180)

      // 绘制文字
      ctx.fillText(text, 0, 0)

      // 恢复状态
      ctx.restore()
    }
  }
  // 绘制到画布
}

调用ctx.draw需要一个延时操作,避免canvas还未完全绘制完成,造成

相关推荐
一枚前端小能手2 小时前
🛡️ Token莫名其妙就泄露了?JWT安全陷阱防不胜防
前端·javascript·安全
薛定谔的算法2 小时前
Vue.js 条件渲染与列表渲染详解:原理、用法与最佳实践
前端·vue.js·前端框架
_前端小李_2 小时前
关于预检请求
前端
复苏季风2 小时前
Vue3 小白的疑惑:为什么用 const 定义的变量还能改?
前端·javascript·vue.js
Mintopia2 小时前
在 Next.js 中接入 Google Analytics 与 PostHog —— 一场“数据偷窥”的艺术演出
前端·javascript·next.js
遂心_2 小时前
React useState:20分钟彻底掌握这个让你"状态满满"的Hook
前端·javascript·react.js
月亮慢慢圆2 小时前
Web Animation API
前端
Mintopia2 小时前
AIGC驱动的Web界面设计:技术逻辑与用户体验平衡
前端·javascript·aigc
盏茶作酒292 小时前
浅拷贝和深拷贝
前端·javascript