微信小程序CanvasContext.drawImage的用法

最近做了一个生成海报的项目,有个需求需要画出图片。

我个人的想法是生成的图片像image的mode模式中的aspectFill显示的图片那样,“缩放模式,保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。”

也就是说保证图片的短边显示出来,超过的部分会被截取掉,图片不会变形

翻看了小程序文档的CanvasContext.drawImage。然后整理了一下以下的代码,此代码只为了说明CanvasContext.drawImage

wxml:

<canvas style="width:300px;height:300px" canvas-id="actReview"></canvas>

 

js中的生成图片的代码如下:

let ctx = wx.createCanvasContext('actReview')
let img = {
  url:'/static/images/img-actImage.png'
}

// 取得图片的宽高
wx.getImageInfo({
  src:img.url,
  success (res) {
    // 绘制白色背景
    ctx.setFillStyle('#fff')
    ctx.fillRect(0, 0, 300, 300)
    
    let imgX = 50 //图片在画布上的x轴坐标
    let imgY = 50 //图片在画布上的y轴坐标
    let imgW = 200 //图片在画布上的宽度
    let imgH = 200 //图片在画布上的高度

    let visibleW = res.width//截取的图片的宽度
    let visibleH = res.height//截取的图片的高度
    let visibleX = null // 所截取的图片的x轴坐标
    let visibleY = null // 所截取的图片的y轴坐标
    let imgBili = imgW / imgH
    let visibleBili = visibleW / visibleH
    if(imgBili < visibleBili){
      let newW = (imgH / visibleH) * visibleW
      const bili = newW / visibleW
      visibleX = Math.abs(imgW - newW) / 2 / bili
      visibleY = 0
      visibleW = imgW * visibleH / imgH
    }else {
      visibleX = 0
      let newH = (imgW * visibleH) / visibleW
      const bili = newH / visibleH
      visibleY = Math.abs(imgH - newH) /2 / bili
      visibleH = visibleW * imgH / imgW
    }
    /**
     * ctx.drawImage(
     *  图片的url, 
     *  所截取的图片的X轴坐标, 
     *  所截取的图片的Y轴坐标, 
     *  所截取的图片的宽度, 
     *  所截取的图片的高度,
     *  图片在画布的X轴坐标,
     *  图片在画布的Y轴坐标, 
     *  图片在画布的宽度, 
     *  图片在画布的高度)
     */
    ctx.drawImage(img.url, visibleX, visibleY, visibleW, visibleH,imgX, imgY, imgW, imgH)

    ctx.draw()
  },
  fail (e) {
    console.log(e)
  }
})

生成的效果图(红色框框部分):

图片原图:

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值