微信小程序-名片生成

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还未完全绘制完成,造成

相关推荐
whltaoin13 分钟前
中秋赏月互动页面:用前端技术演绎传统节日之美
前端·javascript·html·css3·中秋主题前端
IT派同学1 小时前
TableWiz诞生记:一个被表格合并逼疯的程序员如何自救
前端·vue.js
西洼工作室3 小时前
CSS高效开发三大方向
前端·css
昔人'3 小时前
css`font-variant-numeric: tabular-nums` 用来控制数字的样式。
前端·css
铅笔侠_小龙虾4 小时前
动手实现简单Vue.js ,探索Vue原理
前端·javascript·vue.js
哟哟耶耶5 小时前
Starting again-02
开发语言·前端·javascript
Apifox.5 小时前
Apifox 9 月更新| AI 生成接口测试用例、在线文档调试能力全面升级、内置更多 HTTP 状态码、支持将目录转换为模块
前端·人工智能·后端·http·ai·测试用例·postman
Kitasan Burakku6 小时前
Typescript return type
前端·javascript·typescript
叁佰万6 小时前
前端实战开发(一):从参数优化到布局通信的全流程解决方案
前端
笔尖的记忆6 小时前
js异步任务你都知道了吗?
前端·面试