小程序--生成图片库

1,128 阅读2分钟

Painter 的优势

  • 功能全,支持文本、图片、矩形、qrcode 类型的 view 绘制
  • 布局全,支持多种布局方式,如 align(对齐方式)、rotate(旋转)
  • 支持圆角,其中图片,矩形,和整个画布支持 borderRadius 来设置圆角
  • 支持边框,同时支持 solid、dashed、dotted 三种类型
  • 支持渐变色,包括线性渐变与径向渐变。
  • 支持 box-shadow 和 text-shadow,统一使用 shadow 表示。
  • 支持文字背景、获取宽度、主动换行
  • 支持图片 mode
  • 支持元素的相对定位方法
  • 杠杠的性能优化,我们对网络素材图片加载实现了一套 LRU 存储机制,不用重复下载素材图片。
  • 杠杠的容错,因为某些特殊情况会导致 Canvas 绘图不完整。我们对此加入了对结果图片进行检测机制,如果绘图出错会进行重绘。
  • 生成的图片支持分辨率调节
  • 支持使用拖动等操作动态编辑绘制内容

快速开始

1. 引入代码

Kujiale-Mobile/Painter

2. 引入组件

{
  "path": "pages/result/index",
  "style": {
      "navigationBarTitleText": "结果",
      "mp-weixin": {
          "usingComponents": {
              "painter": "../../wxcomponents/Kujiale-Mobile-painter/painter"
          }
      }
  }
}
复制代码

3. 使用组件

<painter
    @imgOK="onImgOk"
    @imgErr="onImgErr"
    customStyle="position: absolute; left:-9999rpx; top:0rpx;"
    widthPixels="750"
    :palette="template"
  />
复制代码

4. 请求接口绘图

getDraw() {
      this.template = {
        background: "#fff",
        width: "420rpx",
        height: "336rpx", //分享图片高度要保持 5:4
        views: [
          {
            type: "image",
            url: this.$api.PUBLIC_IMG_PATH + "/l75dsv-bg.png",
            css: {
              top: "0px",
              left: "0px",
              width: "420rpx",
              height: "336rpx",
            },
          },
          {
            type: "text",
            text: this.dietDesc + " " + this.shareCreatTime,
            css: {
              top: "24rpx",
              left: "210rpx",
              align: "center",
              fontSize: "24rpx",
              color: "#000",
            },
          },
          {
            type: "image",
            url: this.shareValueBg,
            css: {
              top: "69rpx",
              left: "210rpx",
              width: "190rpx",
              height: "190rpx",
              align: "center",
              borderRadius: "95rpx",
            },
          },
          {
            type: "text",
            text: this.params.bloodSugar + "",
            css: {
              top: "116rpx",
              left: "210rpx",
              align: "center",
              fontSize: "60rpx",
              color: "#fff",
            },
          },
          {
            type: "text",
            text: "mmol/L",
            css: {
              top: "178rpx",
              left: "210rpx",
              align: "center",
              fontSize: "28rpx",
              color: "#fff",
            },
          },
          {
            type: "image",
            url: this.$store.getters.storage.userInfo.avatarUrl,
            css: {
              top: "260rpx",
              left: "24rpx",
              width: "60rpx",
              height: "60rpx",
            },
          },
          {
            type: "text",
            text: this.$store.getters.storage.userInfo.nickName,
            css: {
              top: "276rpx",
              left: "96rpx",
              fontSize: "22rpx",
              color: "#000",
            },
          },
          {
            type: "rect",
            css: {
              top: "271rpx",
              right: "24rpx",
              width: "88rpx",
              height: "40rpx",
              color: this.shareBgColor,
              borderRadius: "32rpx",
            },
          },
          {
            type: "text",
            text: this.bloodSugerDesc,
            css: {
              top: "277rpx",
              right: "44rpx",
              fontSize: "24rpx",
              color: this.shareTextColor,
            },
          },
        ],
      };
    },
    
    // 生成成功
    onImgOk(e) {
    //其中 e.detail.path 为生成的图片路径
      wx.hideLoading();
      var filePath = e.detail.path;

      UploadImage(
        filePath,
        (res) => {
          const data = JSON.parse(res.data);
          if (data.code == 100) {
            this.shareImage = data.data;
            this.showShareCard = true;
          }
        },
        (error) => {}
      );
    },
复制代码