微信小程序wx.createCanvasContext废弃,使用wx.createOffscreenCanvas接口的绘制canvas 2d海报遇到的踩坑经验。

<canvas id="myCanvas" type="2d" />

在wxml页面写id,canvas-id已经没用了。然后像html一样,使用js获取这个canvas标签组件,在微信的js获取使用wx自带的方法。如下 

wx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true }).exec((cres) => {

      //在这里可以下获取到canvas组件了,然后创建成画板画布。

        var rect = cres[0]

         console.log(rect)

         var textCanvas = rect.node  // 重点1

         var ctx = textCanvas.getContext('2d')  // 重点2//创建画布

         //这里踩坑1,我直接绘制,发现绘制的宽高和获取到的宽高总有出入,明明打印canvas的宽高和我设置的宽高一样,但是绘制在页面填充颜色,发现宽度小了很多。

        // 后面经过查了大量文献,发现原来需要根据手机的像素同比1:1化,代码如下

        const dpr = wx.getSystemInfoSync().pixelRatio

         textCanvas.width = rect.width * dpr

         textCanvas.height = rect.height * dpr

         ctx.scale(dpr, dpr)

         //然后下面就跟我们在html绘制一样,比如绘制文字

         ctx.font = `bold 18px serif`

         ctx.fillStyle = "#ff6800"

         ctx.fillText("文字",10,10)

         //接下来是绘制图片了,这里踩坑2

         //1.踩坑2,绘制图片需要把图片变成画布再绘制,

        this.getImage("/assets/logo.png").then(image=>{

               ctx.drawImage(image, 10, 20, 38, 38)

        })

})

// 获取图片对象

  async getImage (url,width, height) {  

    const off = wx.createOffscreenCanvas({type:'2d'})

    const image = off.createImage()   

    await new Promise((resolve, reject)=>{      

      image.onload = resolve  // 绘制图片逻辑

      image.src = url

    })

    return image

  },

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
微信小程序通过 Canvas 2D 绘制海报可以用于商品展示、广告宣传等场景。下面介绍一下实现流程: 1. 页面结构 在页面中添加一个 Canvas 标签,设置 id 和宽高: ```html <canvas id="poster" style="width: 750rpx; height: 1334rpx;"></canvas> ``` 2. 获取 Canvas 上下文 在页面的 onLoad 函数中获取 Canvas 上下文: ```javascript let ctx = wx.createCanvasContext('poster'); ``` 3. 绘制背景 使用 Canvas 2D 绘制背景,可以使用 fillRect 方法绘制一个填充矩形: ```javascript ctx.setFillStyle('#ffffff'); ctx.fillRect(0, 0, 750, 1334); ``` 4. 绘制图片 使用 drawImage 方法绘制图片,需要先将图片下载到本地: ```javascript wx.getImageInfo({ src: 'https://example.com/image.png', success: function(res) { ctx.drawImage(res.path, 0, 0, 750, 500); } }); ``` 5. 绘制文本 使用 fillText 或者 strokeText 方法绘制文本,需要设置字体样式和对齐方式: ```javascript ctx.setFontSize(32); ctx.setTextAlign('center'); ctx.fillText('这是一段文本', 375, 600); ``` 6. 保存海报 使用 Canvas 2D 的 toTempFilePath 方法将绘制海报保存到本地: ```javascript ctx.draw(false, function() { wx.canvasToTempFilePath({ x: 0, y: 0, width: 750, height: 1334, canvasId: 'poster', success: function(res) { console.log(res.tempFilePath); } }); }); ``` 完整代码: ```javascript Page({ onLoad: function() { let ctx = wx.createCanvasContext('poster'); ctx.setFillStyle('#ffffff'); ctx.fillRect(0, 0, 750, 1334); wx.getImageInfo({ src: 'https://example.com/image.png', success: function(res) { ctx.drawImage(res.path, 0, 0, 750, 500); } }); ctx.setFontSize(32); ctx.setTextAlign('center'); ctx.fillText('这是一段文本', 375, 600); ctx.draw(false, function() { wx.canvasToTempFilePath({ x: 0, y: 0, width: 750, height: 1334, canvasId: 'poster', success: function(res) { console.log(res.tempFilePath); } }); }); } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值