最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 微信canvas生成分享海报

    正文概述 掘金(一颗痣)   2021-03-06   441

    效果预览

    这里写了一个微信代码片段 developers.weixin.qq.com/s/HSJqczme7…直接截图 微信canvas生成分享海报 上代码

    文字自动换行

    //数据结构
    {
            type: "text",
            x: 10,
            y: 360,
            width: 340,
            fontSize: "14px",
            lineHeight: "18px",
            fontColor: "#000000",
            text: "a我们输入过多的文字来测试看看它会不会换行试看看它会不会换行"
    }
    
    /**
     * @description: 基本画文字
     * @param {*} ctx 画布上下文
     * @param {*} rect 参数对象
     * { //基本格式
     *  fontSize 字体大小
     *  fontColor 字体颜色
     *  text 文本
     *  x,t,width, height//基本属性
     * }
     * @return {*}
     */
    export function fontRext(ctx, rect) {
      ctx.save();
      ctx.font = `${rect.fontSize || "14px"} Microsoft YaHei`;
      ctx.fillStyle = rect.fontColor || "#000000";
      ctx.textAlign = "left";
      ctx.textBaseline = "top";
      ctx.fillText(rect.text, rect.x, rect.y);
      ctx.restore();
    }
    
    
    数据处理
    function drawText(rect) {
            const newRect = JSON.parse(JSON.stringify(rect));
            let textWidth = 0; //累计宽度
            let substringIndex = 0; //截取位置
    
            for (let index = 0; index < rect.text.length; index++) {
              const element = rect.text[index];
    
              // 获取字体实际高度
              textWidth += element.charCodeAt(0) > 255 ? parseInt(rect.fontSize) : Math.ceil(ctx.measureText(element).width);
              //ctx.measureText(element).width
              // textWidth += 14;
              // 字体累计宽度大于文字宽度
              if (textWidth > (rect.width || option.width)) {
                //画截取字段
                newRect.text = rect.text.substring(substringIndex, index);
                fontRext(ctx, newRect);
    
                //设置开始下标 和 枢轴 y
                substringIndex = index;
                textWidth = 0;
                //计算得出每行间距
                const lineHeight = parseInt(newRect.lineHeight || newRect.fontSize) - parseInt(newRect.fontSize);
                newRect.y = newRect.y + parseInt(newRect.fontSize) + lineHeight;
              }
    
              //绘画剩余部分
              if (index === rect.text.length - 1) {
                newRect.text = rect.text.substring(substringIndex, index + 1);
                fontRext(ctx, newRect);
              }
            }
    }
    

    绘画图片圆角图片

    
    //数据结构
     {
            type: "image",
            x: 0,
            y: 0,
            width: 350,
            height: 350,
            img: "https://image.huayixh.com/commodity/Banner/ca031f4ab0134ceb9e6d3e081ecadcfc.jpg"
    },
    const Point = function (x, y) {
      return { x: x, y: y };
    };
    /**
     * @description: 画圆角
     * @param {*} ctx 画布上下文
     * @param {*} rect
     * {
     * round //圆角大小
     * x,t,width, height//基本属性
     * }
     * @return {*}
     */
    export function arcToRect(ctx, rect) {
      var ptA = Point(rect.x + rect.round, rect.y);
      var ptB = Point(rect.x + rect.width, rect.y);
      var ptC = Point(rect.x + rect.width, rect.y + rect.height);
      var ptD = Point(rect.x, rect.y + rect.height);
      var ptE = Point(rect.x, rect.y);
      ctx.beginPath();
      ctx.moveTo(ptA.x, ptA.y);
      ctx.arcTo(ptB.x, ptB.y, ptC.x, ptC.y, rect.round);
      ctx.arcTo(ptC.x, ptC.y, ptD.x, ptD.y, rect.round);
      ctx.arcTo(ptD.x, ptD.y, ptE.x, ptE.y, rect.round);
      ctx.arcTo(ptE.x, ptE.y, ptA.x, ptA.y, rect.round);
      ctx.closePath();
    }
    
    /**
     * @description: 画图片
     * @param {*} ctx 画布上下文
     * @param {*} rect
     *  {
     *   round //圆角
     *   x,t,width, height//基本属性
     * }
     * @return {*}
     */
    export function imageRect(ctx, rect) {
      ctx.save();
      if (rect.round) {
        arcToRect(ctx, rect);
        ctx.clip();
      }
      ctx.drawImage(rect.img, 0, 0, rect.img.width, rect.img.height, rect.x, rect.y, rect.width, rect.height);
      ctx.restore();
    }
    
    //画图像数据处理
    function drawImgs(rect) {
            let poster = canvas.createImage(); // 创建一个图片对象
            poster.src = rect.img;
            poster.onload = function () {
              // 监听图片加载完成
              rect.img = poster;
              imageRect(ctx, rect);
    
              //判断图片是否绘画完成
              imageLength = imageLength - 1;
              if (imageLength === 0) {
                wx.canvasToTempFilePath({
                  canvas: canvas,
                  fileType: "jpg",
                  success(res) {
                    resolve(res.tempFilePath);
                  },
                  fail(err) {
                    reject(err);
                  }
                });
              }
            };
    }
    

    起源地下载网 » 微信canvas生成分享海报

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元