小程序---canvas画图,生成分享图片,画图文字换行

小程序目前只支持转发,不支持分享朋友圈,为了能实现分享,很多线上小程序通过生成分享图片,保存到相册来给用户增加分享的可能。

具体思路及简要代码如下:

一:canvas画图
  drawCanvas:function(){
    var that = this;
    var contentPic = ‘/images/[email protected]‘
    wx.downloadFile({     //当图片为网络图片时,需要先下载到本地,再进行操作,
      url: contentPic,        //否则canvas会加载不到图片,本地的无需这步骤
      success: function (res) {
        contentPic = res.tempFilePath
      }
    })
    var  ctx = wx.createCanvasContext(‘shareImg‘)
    ctx.fillStyle = ‘#fff‘    //这里两句是为了解决canvas生成图片时黑背景的问题
    ctx.fillRect(0, 0, 562, 788)   //填充白色背景
    ctx.setFontSize(32)
    ctx.setFillStyle(‘#333‘)
    ctx.setTextAlign(‘left‘)
    ctx.setTextBaseline(‘middle‘)
    var str = ‘这是标题‘
    this.changLine(true,str,ctx,40,60,36,482)
    var sourse = that.data.detail.source
    ctx.setFontSize(28)
    ctx.fillText(sourse, 40, this.data.titleY)
    var date = that.data.detail.publishDate
    var sourseX = ctx.measureText(sourse).width+56
    ctx.setFontSize(24)
    ctx.setFillStyle(‘#999‘)
    ctx.fillText(date, sourseX, this.data.titleY)
    var content = that.data.detail.summary.replace(/(^\s*)|(\s*$)/g, "")
    ctx.setFontSize(28)
    ctx.setFillStyle(‘#666‘)
    this.changLine(false,content, ctx, 40, this.data.titleY + 60, 36, 482)
    var picY = this.data.titleY + 168
    wx.getImageInfo({
      src: contentPic,
      success: function (res) {
        var widthScale = 482 / res.width
        var heightScale = 250 / res.height
        var sx=0,sy=0
        if (widthScale>heightScale){
          sy=  (res.height-250/(482 / res.width))/2
        }
        else{
          sx=(res.width-482/(250 / res.height))/2
        }
        ctx.drawImage(contentPic, sx, sy, res.width - sx * 2, res.height - sy * 2, 40, picY, 482, 250 )
       ctx.moveTo(40, picY + 274)
       ctx.setStrokeStyle(‘#dedede‘)
       ctx.lineTo(522, picY + 274)
       ctx.stroke()
       ctx.setFontSize(28)
       ctx.setFillStyle(‘#666‘)
       ctx.fillText(‘长按扫码阅读‘, 40, picY + 334)
       ctx.setFontSize(24)
       // ctx.setFillStyle(‘#666‘)
       ctx.fillText(‘全文约‘ + that.data.detail.wordCount + ‘字,约‘ + that.data.detail.readingTime + ‘分钟‘, 40, picY + 382)
       // var qrcode = ‘/images/[email protected]‘
       // ctx.drawImage(qrcode, 344, picY + 274, 178, 178)
       var logo = ‘/images/[email protected]‘
       ctx.drawImage(logo, 397, picY + 315, 72, 72)
       ctx.draw(false, function (e) {
         that.createPoster()
       }
       )
      }
    })

  },
  //画图文字换行,内容、画布、初始x、初始y、行高、画布宽
  changLine: function (isTitle,str, ctx, initX, initY, lineHeight, canvasWidth){

    // 字符分隔为数组
    var arrText = str.split(‘‘);
    var line = ‘‘;
    var lineCount=0;
    var isThreeLine=false;
    for (var n = 0; n < arrText.length; n++) {
      var testLine = line + arrText[n];
      var testWidth = ctx.measureText(testLine).width;
      if (testWidth > canvasWidth) {
        if (lineCount==2) {
          isThreeLine=true
          var length = line.length-2;
          line = line.substring(0, length)+‘...‘;
          ctx.fillText(line, initX, initY);
          return false;
        }
        lineCount++;

        ctx.fillText(line, initX, initY);
        line = arrText[n];
        initY += lineHeight;

      } else {
        line = testLine;
      }

    }
    if (!isThreeLine){
      ctx.fillText(line, initX, initY);
    }
      //记录标题的高度
    if (isTitle){
      this.setData({
        titleY: initY + lineHeight + 8
      })
      }
  },
//生成海报
  createPoster:function(){
    var that = this
    wx.canvasToTempFilePath({
      x: 0,
      y: 0,
      width: 562,
      height: 788,
      destWidth: 1124,
      destHeight: 1576,
      canvasId: ‘shareImg‘,
      fileType: ‘jpg‘,
      success: function (res) {
        that.setData({
          prurl: res.tempFilePath
        })
        wx.hideLoading()
      }
    })
  },

大概就这样,若发现问题,请评论指正~

原文地址:https://www.cnblogs.com/lichunyan/p/8963584.html

时间: 2024-08-26 15:09:13

小程序---canvas画图,生成分享图片,画图文字换行的相关文章

微信小程序 | canvas绘图

1.新的尺寸单位 rpx rpx(responsive pixel): 可以根据屏幕宽度进行自适应. 规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素. 设备 rpx换算px (屏幕宽度/750): px换算rpx (750/屏幕宽度) 2.小程序canvas总结 小程序绘制的单位是px, 基础知识点请参考文档 : canvas中存在一个坐标系,二维的,左上

【小程序源码案例】微信小程序项目开发案例分享

作者:web小二本文标签: 微信小程序 小程序源码案例 小程序项目小程序的开发,并不是适合所有公司,我今天跟大家分享小程序方面的教程,主要是供大家学习使用.学习这种东西,有时候则是单纯的喜欢,没有任何目的,很单纯的为了好玩,记得很早之前学flash,没有想法,就是觉得好玩,纯娱乐爱好而已.到后来玩视频剪辑也是出于同样的原因,不图钱财名利,只是图自己个人爱好娱乐. 但是,学习,有时候则是需要有明确目的,特别是关系到自己吃饭问题的时候,你就需要非常有目的去学习,并且还需要制定好学习的计划与目标,希望

小程序-将页面生成一个小程序码分享出去

这个需求我遇到过2次.一次是在识别二维码后跳转到其它页面,另一次是识别二维码后进入到生成小程序码的当前页面. 我有一个梦想,就是成为一名黑客!!!!!! 小程序中js wx.request({        url: '',        method: 'POST',        data: {        ModuleName: "",    //空间名 接口文档里每个接口会有标明 必填        MethodName: "GetQrCode",   

微信小程序 canvas 绘图问题总结

业务中碰到微信小程序需要生成海报进行朋友圈分享,这个是非常常见的功能,没想到实际操作的时候花了整整一天一夜才搞好,微信的 canvas 绘图实在是太难用了,官方快点优化一下吧. 业务非常简单,只需要将用到的图片,文案素材拼装到一张图片,保存到本地就可以了. 首先创建画布,将一张网上的图片画到画布上. const ctx = wx.createCanvasContext('shareCanvas'); ctx.drawImage("https://img3.doubanio.com/view/ph

小程序canvas使用,及一些坑,以及自己的一些小总结

自己做了一个小程序,主要用于给头像加图标的那种,和qq似的,主要用canvas做的, 第一回用,掉了很多坑,所以今天系统的总结一下自己所做的,如果大家有不理解的地方,欢迎提问 canvas可以用来画一些东西,前台生成一些海报什么的,可以保存base64图片(待定,因为图片转base64,有点模糊), canvas中介绍的各种方法有很多参数,不理解的话请自行到小程序开发文档查看 我合成的方法是,第一步:获取系统信息,第二步:画背景,第三步:在这个背景上画另外一张图片,进行合成,然后转base64图

小程序 canvas 2d 新接口 绘制带小程序码的海报图

截止2020.3.26,小程序官方文档中,有两种绘制方式:Canvas 2D.webGL 文档地址:https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html 而开发者工具中,官方推荐使用性能更好的2d模式,用法如下所示: <canvas type="2d" id="myCanvas"></canvas> 但是网上大多数教程都是使用旧的接口,如: <can

小程序canvas文本换行生成图片

一.图片透明及旋转 let ctx = wx.createCanvasContext('shareImg') ctx.drawImage('../../../' + res[0].path, 0, 0, w, h) ctx.save() ctx.globalAlpha = 0.2 ctx.rotate(-15*Math.PI/180) 二.字体加粗 let text = '这是加粗的文本' ctx.fillText(text, 194, 378 + 0.5) ctx.fillText(text,

微信 小程序 canvas

测试手机为IPHONE6,开发者工具版本0.10.102800 微信小程序里的canvas 非 h5 canvas有很多不一样的地方,以下把微信小程序的canvas叫做wxcanvas 下面全是我一点点测试出的干货,耐心看: 1.wxcanvas,不像h5canvas那样有width和height属性和width和height的style样式.他只有style样式,可以理解为他就是个框吧: 2.wxcanvas不要当成真的H5canvas,就当它是个div就行,画出范围的东西也是存在的,改变wi

小程序canvas截图组件

最近做一个小程序的过程中,需要用到截图功能,网上搜了一下,发现没有符合要求的,就自己搞了个组件,方便复用. 目前功能很简单,传入宽高和图片路径即可,宽高是为了计算截图的比例,只支持缩放和移动. 实现思路是: 1.模拟一个截取框:2.移动图片位置,缩放图片:3.获取图片在其中的位置(left,top,width,height):4.使用canvas绘制图片,然后截取就ok了. 其中第二步的缩放图片比较麻烦,缩放中心点以及平滑缩放 以下是我的实现方式 wxml: <!--component/picP