效果图

canvas api 准备

绘制图片

context.drawImage(image, dx, dy, dWidth, dHeight);

image:绘制在Canvas上的元素,可以是各类Canvas图片资源(见CanvasImageSource),如图片,SVG图像,Canvas元素本身等。
dx:在Canvas画布上规划一片区域用来放置图片,dx就是这片区域的左上角横坐标。
dy:在Canvas画布上规划一片区域用来放置图片,dy就是这片区域的左上角纵坐标。
dWidth:在Canvas画布上规划一片区域用来放置图片,dWidth就是这片区域的宽度。
dHeight:在Canvas画布上规划一片区域用来放置图片,dHeight就是这片区域的高度。

绘制文字

context.fillText(text, x, y [, maxWidth]);

text:用来填充的文本信息
x:填充文本的起点横坐标。
y:填充文本的起点纵坐标。
maxWidth:填充文本的最大宽度,超出会压缩文本宽度而非换行

绘制圆

context.arc(x, y, radius, startAngle, endAngle [, anticlockwise]);

x:圆弧对应的圆心横坐标。
y:圆弧对应的圆心纵坐标。
radius:圆弧的半径大小。
startAngle:圆弧开始的角度,单位是弧度。
endAngle:圆弧结束的角度,单位是弧度。
anticlockwise:弧度的开始到结束的绘制是按照顺时针来算,还是按时逆时针来算。如何设置为true,则表示按照逆时针方向从startAngle绘制到endAngle。

裁切

context.clip();

比例:用来适配不同屏幕

比例 = 可使用窗口宽度 / 设计稿宽度

const ratio = wx.getSystemInfoSync()?.windowWidth / 750;

解决 canvas 绘制不清晰

const dpr = wx.getSystemInfoSync().pixelRatio;
canvas.width = width * dpr;
canvas.height = height * dpr;
context.scale(dpr, dpr);

说明绘制圆的参数如何得到

context.arc(122 * ratio, 100 * ratio, 30 * ratio, 0, (Math.PI / 180) * 360);

头像半径 30
头像距左边 92
头像距上边 70
x = 92 + 30
y = 70 + 30
r = 30
startAngle = 0
endAngle = (Math.PI / 180) * 360) 弧度转换为角度相对友好

完整代码

html

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

css

#myCanvas{margin: 50rpx auto;width: 422rpx;height: 338rpx;
}

js

initCanvas() {let that = this;const query = wx.createSelectorQuery();query.select("#myCanvas").fields({ node: true, size: true }).exec(async (res) => {const width = res[0].width;const height = res[0].height;const canvas = res[0].node;const context = canvas.getContext("2d");// 比例const ratio = wx.getSystemInfoSync()?.windowWidth / 750;const dpr = wx.getSystemInfoSync().pixelRatio;canvas.width = width * dpr;canvas.height = height * dpr;context.scale(dpr, dpr);that.setData({canvas,});// 绘制背景context.beginPath();await that.loadImg("/pages/serviceChain/img/auth_share.png",canvas,context,0,0,422 * ratio,338 * ratio);// 绘制文字let name = wx.getStorageSync(`${wx.getStorageSync("currentUid")}_userInfo`)?.name;if (name.length > 5) {name = name.slice(0, 5) + "...";}context.beginPath();context.font = `22*${ratio}`;context.textAlign = "center";context.fillText(name, 60 * ratio, 212 * ratio, 70 * ratio);// 绘制圆context.beginPath();context.arc(60 * ratio,158 * ratio,30 * ratio,0,(Math.PI / 180) * 360);context.fill();context.clip();// 绘制头像context.beginPath();const avatar = wx.getStorageSync(`${wx.getStorageSync("currentUid")}_userInfo`)?.image;await that.loadImg(avatar,canvas,context,30 * ratio,128 * ratio,60 * ratio,60 * ratio);});},save() {return new Promise((resolve, reject) => {wx.canvasToTempFilePath({canvas: this.data.canvas,success: (res) => {return resolve(res.tempFilePath);// wx.saveImageToPhotosAlbum({//   filePath: res.tempFilePath,//   success(res) {//     wx.showToast({//       title: "保存成功,请在相册中查看",//     });//   },// });},fail(error) {return reject(error);},});});},loadImg(src, canvas, context, x, y, width, height) {return new Promise((resolve, reject) => {try {const img = canvas.createImage();img.src = src;img.onload = function () {context.drawImage(img, x, y, width, height);resolve(canvas.toDataURL("image/png"));};} catch (error) {reject(error);}});},async onShareAppMessage() {const res = await this.save();return {path: `/pages/`,imageUrl: res,};},

小程序 canvas 2d 绘制海报相关推荐

  1. 记一次微信小程序canvas 2d 生成海报问题

    因项目需要,需要制作海报分享. 如: 事情总是不是那么顺利,canvas生成海报生成中遇到各种奇葩问题.一开始是 wx.canvasToTempFilePath 中获取不到canvas对象,调用返回  ...

  2. 微信小程序canvas 2d 绘制图片与文字 导出图片

    wxml内容 如下 <canvas id="myCanvas" type="2d"style="width: {{ canvas.width } ...

  3. 小程序 canvas 2d 绘制图片并保存

    获取canvas实例,使用的官方的代码.用一个变量canvas保存实例,后续保存时会调用. data () {return {canvas: null // 实例} }, onReady() {con ...

  4. uniapp开发微信小程序使用painter绘制海报

    uniapp开发微信小程序使用painter绘制海报 参考文章: 1.简书大佬文章https://www.jianshu.com/p/e9cab600cf6c 2.CSDN大佬文章https://bl ...

  5. 小程序canvas 2d 绘图无法drawImage图片?

    小程序canvas 2d 绘图无法drawImage图片? 微信iOS 7.0.20 版本 使用canvas 2d 绘制drawImage时无法成功绘制,图片不显示,img1.onload不执行,执行 ...

  6. 小程序canvas循环绘制内容的问题

    这次的业务逻辑中要用到小程序canvas. 这个canvas的要求是一段文字中间会加入一张图片然后在接下去写一段文字内容.并且文字和图片是随机出现的,因此只能用for循环来做.这里有一个问题就是can ...

  7. 小程序Canvas生成分享海报避坑指南

    关于小程序使用Canvas画布生成分享海报,网上有很多的教程,但是结合到自己的业务上面就BUG百出了 接下来分享一下我的经历 微信出了新的api 微信公众平台目前更新不是太即使,查问题好多帖子都是一两 ...

  8. 微信小程序canvas商品分享海报

    先上效果图 1.wxml <button class="footer-item" bindtap="creatShareImageTap">分享&l ...

  9. 【修复日常bug】微信小程序canvas画商品海报出现个别用户无法生成的情况

    微信小程序,在使用canvas画海报的时候,会导致个别用户无法生成的情况,你们可以尝试把绘画某些块的代码注释掉再进行扫码调试,我前几天就遇到个别客户无法生成商品海报的情况,刚开始是以为上一个同事留的坑 ...

最新文章

  1. oracle 全局临时变量,如何解析Oracle PL / SQL中的简单XML片段并将其加载到全局临时表中?...
  2. 【Axure原型图】—— 4. Tab Control(选项卡)
  3. “本地连接”属性中“身份验证”选项卡消失的处理方法
  4. CTFshow 爆破 web27
  5. 根据BAPI_PO_CREATE1创建采购订单
  6. wxWidgets:wxChildFocusEvent类用法
  7. DCMTK:测试CT Table Dynamics FG类
  8. 用 subsetting 限制连接池中的连接数量
  9. mysql备份表恢复数据库_mysql备份恢复数据库据/表
  10. (41)Gulp Reload热更新
  11. 博文目录(最新更新:2018.6.6)
  12. java xfire指定参数名_Java如何获取方法参数具体名称?这是个好问题!
  13. SSM配置后可以访问静态html文件但无法访问其他后台接口的解决方案
  14. 怎么破坏联合索引,使ABC的联合索引,走B的索引
  15. 关于应用程序无法启动,因为应用程序的并行配置不正确的解决办法
  16. jwplayer 初始化设置项
  17. Day6789:Keep Calm N Carry On
  18. 一些linux和OpenGL的笔记
  19. 定积分的基本性质3 保序性
  20. 《勇者名录》11.19正式上线链游玩家|休闲养肝、探索大陆

热门文章

  1. (附源码)计算机毕业设计ssm火车订票系统
  2. Javascript的字符串String的编码之unicode的处理
  3. 人脸识别---排序测度特征(Ordinal Measures)
  4. 我的2017杭州云栖大会参会体验(多图)
  5. 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题
  6. iOS 调用手机浏览器打开网页
  7. gmail怎么登陆?
  8. java 日志查看_Java日志
  9. python 协程库_python协程概念
  10. python中元组怎么存放元素_关于python列表和元组的基本操作