微信小程序canvas画布新接口type为2D时drawImage方法的使用以及注意事项

标签: 微信小程序  前端  小程序  

微信小程序canvas画布自2.9.0 起支持一套新 Canvas 2D 接口(需指定 type 属性),但文档不全,从原canvas的api转变到新的api时遇到不少问题,现将新版与旧版的画布载入图片方法整理一下,避免再次入坑。
旧版代码如下

<canvas style="width:100vw; height:100vh;" canvas-id="canvas_box" ></canvas>
onReady() {
    let ctx = wx.createCanvasContext("canvas_box");
    ctx.drawImage("../../assets/img/cat.jpg", 0, 0);
    ctx.draw();
  }

新版注意事项:

  1. 需指定canvas组件的type属性为2d,如果指定了此属性,则canvas-id属性无需指定;
  2. 通过获取元素节点的方式获取canvas对象:wx.createSelectorQuery().select(’#canvas_box’),如果是在自定义组件 component 内,则需要加in获取:wx.createSelectorQuery().in(this).select(’#canvas_box’);
  3. Canvas 2D(新接口)需要显式设置画布宽高 (默认为 300x150);
  4. 旧版的drawImage方法的第一个参数是图片路径,为字符串如:"…/…/assets/img/cat.jpg",新版的api同web一致,需是这些类型:HTMLImageElementHTMLCanvasElementImageBitmap等,详情可参见这里CanvasRenderingContext2D.drawImage()CanvasImageSource
  5. drawImage方法需要放在图片img的onload方法里面执行
  6. 如果需要向canvas里载入多张图片,则需要分别创建多个img对象。

新版代码如下
wxml:

<view class="content">
  <canvas  type="2d" disable-scroll="true" id="canvas_box" class="canvas_box"></canvas>
</view>

wxss:

.content {
      padding: 20rpx;
}
.canvas_box {
      width: 100%;
      height: 50vh;
      border: 1px dashed #ddd;
}

javascript:

     /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
            const query = wx.createSelectorQuery()
            query.select('#canvas_box')
                  .fields({
                        id: true,
                        node: true,
                        size: true
                  })
                  .exec(this.init.bind(this));
      },
      init(res) {
            const canvas = res[0].node
            const ctx = canvas.getContext('2d')
            const dpr = wx.getSystemInfoSync().pixelRatio
            //新接口需显示设置画布宽高;
            canvas.width = res[0].width * dpr
            canvas.height = res[0].height * dpr
            ctx.scale(dpr, dpr);
            this.setData({
                  canvas,
                  ctx
            });
            this.canvasDraw();//向画布载入图片的方法
            console.log(res)
      },
      canvasDraw() {
            let img = this.data.canvas.createImage();//创建img对象
            //如果需要向canvas里载入多张图片,则需要分别创建多个img对象
            //let img2=this.data.canvas.createImage();
            //    img2.οnlοad=()=>{};
            //    img2.src="";
            img.onload = () => {
                 //img.complete表示图片是否加载完成,结果返回true和false;
                  console.log(img.complete);//true
                  this.data.ctx.drawImage(img, 0, 0, this.data.canvas._width, this.data.canvas._height);
            };
            img.src = "../../assets/img/cat.jpg";
            console.log(img.complete);//false
      },

获取的canvas组件的节点信息返回的是一个数组,如下图:
canvas组件节点信息

版权声明:本文为Mr_WangGeGe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mr_WangGeGe/article/details/106786818

智能推荐

小程序Canvas使用及注意事项

前言 公司的小程序项目已经成功上线,这期间也踩过不少坑,影响最深刻的就是canvas,做过海报分享的童鞋应该都懂,微信小程序本身是不支持分享到朋友圈这种操作的,所以就需要我们自己来实现canvas绘制海报并保存到本地相册,那么接下来就总结一下canvas的使用和本人在写canvas时踩过的一些坑。 初识canvas 关于canvas的描述,官网写的很清楚,我就不在赘述了,直接上图。附上官网链接 h...

微信小程序API详解 & express模拟接口及调用 & 小程序接口调用注意事项

微信小程序API详解 小程序开发框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。 根据api的名称大体可以分为如下三类 事件监听 API 同步 API 异步 API 微信API基本使用 界面API:加载提示 wx.showLoading wx.hideLoading wx.showToast wx.hideToast 调用后台接口 测试接口 wx...

小程序图片转Base64,方法总结。

小程序图片转base64 前言:看了很多博客,小程序社区也逛了个遍,依然找不到小程序图片在本地转base64的方法,接下来就把所有方法做个总结,作为一个野生程序员,好东西绝对要分享。 第一种方法 先上代码 代码看起来似乎没有问题,but~~~~~,人家微信根本就没提供 FileReader()这个方法,所以,这个方法在小程序这里,直接pass掉就行了,不可行。 第二种方法 这个方法很好,代码也是最...

LC 剑指 Offer 36. 二叉搜索树与双向链表

LC 剑指 Offer 36 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱...

HDU5758(Explorer Bo 最小链覆盖的 所有链的长度总和最小 树上链dp)

题目 题意: 给你1颗树。起点可以在n个点之间任意选择。每次走到头了,转方向或切换到另一个点都花费1个魔法。它想把n-1条道路都经过一遍,但是想花费魔法的次数最少。问最少情况下它走路最短是多少。 思路: 首先,一棵树的叶子节点的个数不管以谁为根都是一样的。假如这颗树的叶子节点个数是num。1.num是偶数 那么它使用的魔法次数最少就是num/2,叶子节点两两结合形成链。 2.num是奇数。使用的魔...

猜你喜欢

redis集群

redis集群 需求来源:一台服务器不能满足开发; 注意:集群往往都伴随着分布式 集群:简单理解就是很多台服务器共同实现同一个业务 集群和分布式概述 分布式:将不同的业务分布在不同的地方;比如按照服务类型就有 web应用和数据库;按照功能模块分为 xx(采购)模块和xx(订单)模块; 集群提供了以下两个关键特性: 1、可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从...

Express初始化一个项目&git提交一个项目

安装Express Express 是node.js上最流行的web开发框架,正如他的名字一样,使用他我们可以快速的开发一个web应用,我们用exxpress来搭建: 安装express命令行工具,使用它我们可以初始化一个express项目 创建一个项目: 然后根据提示(如上图),我们输入如下命令: 他会下载项目所依赖的包 然后接着输入: 最后访问一下: 提交一个项目 打开项目所在目录然后进入sh...

linux服务器某些第三方接口可以ping 通但是没有返回数据的原因

今天测试提了一个bug,查询第三方接口的天气接口一直没有数据返回、我当时一直以为是自己的代码问题。在代码的地方打了断点 , 服务器日志一直是开始发送请求,却没有报错,也没有返回数据 接下来是个get请求 在本地,可以有返回的数据,但是在服务器上面就是没有返回 这个是在服务器ping 的状态,是可以ping通的 一直卡着没有数据返回。。。。。 但是使用curl -v 去请求的时候一直没有返回 但是其...

第九课 常见的二叉树:平衡二叉树之红黑树

第九章 常见的二叉树:平衡二叉树之红黑树 1 背景 2 定义 3 红黑树与AVL树对比 4 树结构调整 5 代码实现 5.1 红黑树的插入 5.2 红黑树的删除 5.3 具体代码实现 1 背景 对于二叉排序树,时间复杂度最差时候会是 O(n),比如插入的元素是有序的,生成的二叉排序树就是一个链表,这种情况下,需要遍历全部元素才行。为了改变排序二叉树存在的不足,Rudolf Bayer 在 1972...

rocketmq quick start

rocketmq里面的角色: rocketmq里面有nameserver,master,broker三种角色 producer(生产者,生产者代码需要自己编写)和consumer(消费者,消费者代码需要自己编写)都需要访问 nameserver,已得知消息存放在的位置,nameserver就相当于分发的作用 master其实也是broker,只是他比较特别,一台master下面可以连着多台brok...