小程序端 canvas 常见操作

Welcome to css2canvas ?

用于小程序端生成海报 css2canvas
接近 css 语法封装

? Homepage

开始使用

  1. 找到css2canvnas文件。放到自己项目任意地方
git clone https://gitee.com/Jioho/applets-tool

cd applets-tool/css2canvas/miniprogram/utils

# 拷贝css2canvas.js到自己项目中


```2. 在需要用到的页面,引入对应 js

```javascript
import css2canvas from "你的项目路径/css2canvas"
  1. 创建相关对象(页面的 canvas 标签不可缺)
<!-- css部分 -->
.canvas-show { width: 100vw; height: 100vh; }

<!-- wxml -->
<canvas canvas-id="canvas-show" class="canvas-show" id="canvas-show"></canvas>
// 使用小程序的api `wx.createCanvasContext` 获取canvas对象
let canvasShow = new css2canvas(wx.createCanvasContext("canvas-show"))

canvasShow.drawingView([...]) // 传入数组,配置canvas(具体代码下面有示例)
  1. 生成效果图

在这里插入图片描述

示例代码

canvasShow
  .drawingView([
    {
      type: "roundRect",
      x: 0,
      y: 0,
      width: 560,
      height: 822,
      // background: "#ffffff",
      borderWidth: 1,
      borderRadius: 0,
      clip: false
    },
    {
      type: "text",
      x: 55,
      y: 30,
      color: "#999999",
      fontSize: 22,
      baseline: "top",
      content: "2019/07/29"
    },
    {
      type: "text",
      x: 55,
      y: 70,
      color: "#1ECFBB",
      fontSize: 28,
      baseline: "top",
      content: "今日 · 推荐"
    },
    {
      type: "image",
      imgUrl: "../../assets/default_goods_image.jpg",
      x: 55,
      y: 128,
      width: 460,
      height: 460
    },
    {
      type: "tag",
      x: 54,
      y: 618,
      content: "店铺名称",
      color: "#ffffff",
      fontSize: 24,
      background: "#1ED0BC",
      radiusTop: 0,
      radiusRight: 30,
      radiusBottom: 0,
      radiusLeft: 30,
      padding: 12,
      paddingLeft: 15,
      paddingRight: 15
    },
    {
      type: "text",
      x: 386,
      y: 772,
      content: "长按识别二维码",
      color: "#999999",
      fontSize: 20,
      textAlign: "left",
      baseline: "top"
    },
    {
      type: "image",
      imgUrl: "../../assets/default_goods_image.jpg",
      x: 392,
      y: 626,
      width: 125,
      height: 125
    },
    {
      type: "text",
      x: 55,
      y: 690,
      width: 334,
      content: " 拼团 这个是商品名称这个是商品名称这个是商品名称这个是商品名称这个是商品名称这个是商品名称",
      color: "#666666",
      fontSize: 24,
      textAlign: "left",
      overflow: "warp",
      maxLine: 2,
      lineHeight: 1.5
    },
    {
      type: "tag",
      x: 55,
      y: 688,
      content: "拼团",
      background: "#ffffff",
      padding: 5,
      paddingTop: 2,
      paddingBottom: 2,
      color: "#ffffff",
      fontSize: 20,
      borderWidth: 2,
      borderRadius: 10
    },
    {
      type: "tag",
      x: 55,
      y: 688,
      background: "rgba(24,209,189,.5)",
      content: "拼团",
      padding: 5,
      paddingTop: 2,
      paddingBottom: 2,
      color: "#ffffff",
      fontSize: 20,
      borderColor: "#1ED0BC",
      borderWidth: 2,
      borderRadius: 10
    },
    {
      type: "prefixText",
      x: 55,
      y: 792,
      color: "#FF3131",
      textAlign: "left",
      content: "100",
      tag: "¥",
      fontSize: 36,
      tagSize: 28
    },
    {
      type: "prefixText",
      x:
        ctx.getWidth({ text: "100", fontSize: 36, returnPx: false }) +
        ctx.getWidth({ text: "¥", fontSize: 28, returnPx: false }) +
        70,
      y: 792,
      color: "#999999",
      textAlign: "left",
      content: "200",
      tag: "¥",
      fontSize: 28,
      tagSize: 20,
      isDel: true,
      delColor: "#999999"
    }
  ])
  .then(res => {
    console.log("绘制完成")
  })

API 文档

  • 常用 drawingView 方法进行传入 canvas 配置渲染,其实就是调用了内置的 API 进行渲染.所以必须指定 type 找到对应的 API
  • 所有的 API 都可单独使用,单独使用的 API 需要在调用后自己使用 canvasShow.ctx.draw(true) 进行绘制
  • 其中 canvasShow 是通过 new css2canvas 得到的
  • ctxnew css2canvas 后生成的内置对象.对应页面的 canvas 可操作对象

drawingView 传入 JSON 配置生成配图

根据传入的数组数据,生成 canvas 图,按数组的顺序进行渲染(如果元素有重叠后面的会在渲染会覆盖前面的)
返回值为 Promise 对象.监听画布渲染完毕

数组每一项都必须带有 type 参数。否则对应的索引配置将不会进行渲染

var canvasShow = new css2canvas(`canvas对象`)
canvasShow.drawingView([
  {
    type: "roundRect", // 每一项索引必传 !!
    x: 0,
    y: 0,
    width: 560,
    height: 822,
    borderWidth: 1,
    borderRadius: 0,
    clip: false
  }
]) // 传入数组,配置canvas(具体代码下面有示例)

type 有效值

type描述对应的方法
roundRect绘制矩形/圆角区域roundRect
image绘制图片drawImage
text绘制普通文本drawText
tag绘制带背景/边框的标签文本drawTag
prefixText绘制带前缀的文本(通常前缀字体较小,主体较大,常用于价格)drawPrefixText
line绘制直线drawLine


roundRect 矩形/圆角区域

绘制指定大小 背景/边框,裁减区域/不裁剪区域,直角/指定圆角弧度 区域
对应 type:roundRect

示例

var canvasShow = new css2canvas(`canvas对象`)

// 从0,0点,绘制 宽*高为 560* 822
// 绘制一个边框宽度为1
// 圆角为 border-radius:10rpx 20rpx 5rpx 10rpx
// 的区域,并且开启裁减区域(后面所有的内容都会在该区域内)
canvasShow.roundRect({
  x: 0,
  y: 0,
  width: 560,
  height: 822,
  borderWidth: 1,
  borderRadius: 0,
  radiusTop: 10,
  radiusRight: 20,
  radiusBottom: 5,
  radiusLeft: 10
  clip: true
})

参数说明

参数类型描述默认值必填
paramObject配置项
param.xNumberx 坐标
param.yNumbery 坐标
param.widthNumber矩形区域的宽度
param.heightNumber矩形区域的高度
param.borderWidthNumber边框的宽度0
param.borderRadiusNumber圆角弧度0
param.radiusTopNumber左上圆角弧度borderRadius
param.radiusRightNumber右上圆角弧度borderRadius
param.radiusBottomNumber右下圆角弧度borderRadius
param.radiusLeftNumber左下圆角弧度borderRadius
param.borderColorNumber边框线条的颜色
param.backgroundNumber区域的背景色
param.clipBoolean区域是否开启裁减false

Bug&Tips

  • 在小程序中 clip 连续调用有可能会失效(慎用 clip 属性。如果是图片需要绘制圆角图片,尽量采用图片的形式)

drawImage 绘制图片

绘制指定大小的图片,同样可以指定圆角弧度
对应 type:image

示例

var canvasShow = new css2canvas(`canvas对象`)
canvasShow.roundRect({
  type: "image",
  imgUrl: "../../assets/default_goods_image.jpg", // 图片需要是本地图片(不能是网络图片)
  x: 55,
  y: 128,
  width: 460,
  height: 460,
  borderRadius: 230
})

参数说明

参数类型描述默认值必填
paramObjct绘制的对象参数
param.imgUrlString图片路径(必须是可用的路径)
param.xNumberx 坐标
param.yNumbery 坐标
param.widthNumber宽度
param.heightNumber高度
param.borderRadiusNumber统一圆角的宽度
param.radiusTopNumber圆角,上 弧度borderRadius
param.radiusRightNumber圆角 右 弧度borderRadius
param.radiusBottomNumber圆角 下 弧度borderRadius
param.radiusLeftNumber圆角 左下 弧度borderRadius

Bug&Tips

  • 图片渲染需要本地图片(或者是微信的临时文件路径也行)。获取网络图片的本地路径,在该示例的 utils 方法有提及。以后可能会兼容到该库中
  • 使用 borderRadius 属性时,由于 小程序clip属性的 bug。有可能在 ios 上图片不能才裁减,建议可以用一张圆角透明的图片进行覆盖在渲染的图片之上(渲染 2 张图片),达到圆角图片的效果

drawPrefixText 带标签文本(商品价格之类的)

用于绘制价格,通常价格是有隔壁一个小图标 或者其他的字符,比数字又小一点,还有一个删除线的功能也继承到该 API
考虑到删除的价格在原价之后,所以调用该 API 会返回绘制的价格的宽度(rpx),如果用数组一次性渲染,只能自己先获取文本宽度了
渲染价格也能实现在指定宽度中的对齐方式
对应 type : prefixText

示例

var canvasShow = new css2canvas(`canvas对象`)

// 先渲染现价
var nowPriceWidth = canvasShow.drawPrefixText({
  x: 55,
  y: 792,
  color: "#FF3131",
  textAlign: "left",
  content: "100",
  tag: "¥",
  fontSize: 36,
  tagSize: 28
})

// 然后渲染原价
canvasShow.drawPrefixText({
  x: nowPriceWidth + 20, // 根据返回的现价宽度基础上渲染现价
  // 该方式用于获取指定文本宽度
  // x:
  //   canvasShow.getWidth({
  //     text: "100",
  //     fontSize: 36,
  //     returnPx: false
  //   }) +
  //   canvasShow.getWidth({
  //     text: "¥",
  //     fontSize: 28,
  //     returnPx: false
  //   }) +
  //   70,
  y: 792,
  color: "#999999",
  textAlign: "left",
  content: "200",
  tag: "¥",
  fontSize: 28,
  tagSize: 20,
  isDel: true,
  delColor: "#999999"
})

参数说明

参数类型描述默认值必填
paramObjct渲染的对象
param.xNumberx 坐标
param.yNumbery 坐标
param.contentString渲染的主内容
param.widthNumber渲染文本的宽度(用于居中等操作实现)
param.tagString需要渲染的小标
param.fontSizeNumber主文本的字体大小28
param.tagSizeNumber小图标的字体大小 (# ¥ x 等任意字符)20
param.colorString文本的颜色
param.textAlignString居中对齐方式 [ left,center,right ]left
param.fontWeightNumber字体加粗范围 [ 100:普通,200:加粗一点,300:更粗 ]
param.isDelBoolean是否有删除线false
param.delColorString删除线的颜色

drawTag 绘制标签

绘制标签文本
可填充 背景/边框 2 者可并存,并且设置 padding 距离。支持圆角的配置
对应 type: tag

示例

var canvasShow = new css2canvas(`canvas对象`)

canvasShow.drawTag({
  type: "tag",
  x: 54,
  y: 618,
  content: "店铺名称",
  color: "#ffffff",
  fontSize: 24,
  background: "#1ED0BC",
  radiusTop: 0,
  radiusRight: 30,
  radiusBottom: 0,
  radiusLeft: 30,
  padding: 12,
  paddingLeft: 15,
  paddingRight: 15
})

参数说明

参数类型描述默认值必填
paramObject配置对象
param.xNumberx 坐标
param.yNumbery 坐标
param.contentString标签内容
param.fontSizeNumber标签字体大小28
param.colorString标签文本颜色
param.backgroundString标签背景色rgba(0, 0, 0, 0)
param.paddingNumber标签 padding 距离0
param.paddingTopNumber标签顶部 padding 距离padding
param.paddingRightNumber标签右边 padding 距离padding
param.paddingBottomNumber标签底部 padding 距离padding
param.paddingLeftNumber标签左边 padding 距离padding
param.borderWidthNumber标签描边宽度,默认为 00
param.borderColorString标签描边颜色rgba(0, 0, 0, 0)
param.borderRadiusNumber统一圆角的宽度0
param.radiusTopNumber圆角,上 弧度borderRadius
param.radiusRightNumber圆角 右 弧度borderRadius
param.radiusBottomNumber圆角 下 弧度borderRadius
param.radiusLeftNumber圆角 左下 弧度borderRadius

drawText 绘制文本

进过封装后的绘制文本方法,可以使文本换行超出隐藏超出加省略号等功能
也支持基础的文本居中方向,加粗
渲染文本为了平常写 css 的习惯,修改了默认对齐方式为左边,开始坐标为左上角的点(默认的 canvas 开始坐标为右下角)
对应 type:text

示例

var canvasShow = new css2canvas(`canvas对象`)

// 设置最大文本宽度为 334rpx.
// 文本左对齐
// 文本换行,最大为2行
// 行高为1.5
canvasShow.drawText({
  type: "text",
  x: 55,
  y: 690,
  width: 334,
  content: " 拼团 这个是商品名称这个是商品名称这个是商品名称这个是商品名称这个是商品名称这个是商品名称",
  color: "#666666",
  fontSize: 24,
  textAlign: "left",
  overflow: "warp",
  maxLine: 2,
  lineHeight: 1.5
})

参数说明

参数类型描述默认值必填
paramObject绘制文本的对应参数
param.xNumberx 坐标
param.yNumbery 坐标
param.widthNumber文本最大的宽度
param.overflowString文本超出后的处理 [ ellipsis:加省略号,hidden:直接隐藏,warp:超出换行 ]ellipsis
param.maxLineNumber换行最大的行数
param.contentString需要渲染的文本
param.textAlignString文本对齐方式 [ left,right,center ]left
param.fontSizeNumber字体大小
param.colorString文本颜色
param.fontWeightNumber文本加粗 [ 100:默认 200:加粗 300:更粗 ]100
param.lineHeightNumber换行文本的行高(判断下一行开始的 y 坐标)1
param.baselineString文本基线对齐方式,默认为 top 。 详细可以看 canvas 文档top

getWidth 获取文本宽度

渲染元素的时候通常需要知道另外一些元素的宽高,这个可以获取指定文本,执行大小所占用的宽度
支持返回 px 或者 rpx

示例

var canvasShow = new css2canvas(`canvas对象`)

// 测量字号为36的 100 的文案的宽度
canvasShow.getWidth({
  text: "100",
  fontSize: 36,
  returnPx: false
})

参数说明

参数类型描述默认值必填
paramObject获取文本宽度的对应参数
param.textString需要测量的文本‘’
param.fontSizeObject需要测量文本的字体大小根据上一次渲染的文本字体大小
param.returnPxBoolean是否返回 px 像素false 默认返回 rpx 像素

Bug&&Tips

  • 由于 canvas 渲染差异,传入 100'100' (数字和字符串的区别)获取的宽度会存在一定的差异,建议都转换成字符串类型才测量文本宽度

drawLine 绘制直线

绘制指定的直线,指定开始和结束坐标

示例

var canvasShow = new css2canvas(`canvas对象`)
canvasShow.drawLine({
  x: 0,
  y: 0,
  end_x: 10,
  end_y: 10,
  width: 1,
  background: "#ccc"
})

参数说明

参数类型描述默认值必填
paramObject绘制直线需要的参数
param.xNumber起始点 x 坐标
param.yNumber起始点 y 坐标
param.end_xNumber终点 x 坐标
param.end_yNumber终点 y 坐标
param.widthNumber直线的宽度
param.backgroundNumber直线填充的颜色

作者

? Jioho

Show your support

Give a ⭐️ if this project helped you!


This README was generated with ❤️ by readme-md-generator

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值