前一阵有完成在小程序内动态生成图片再进行分享的需求,是很常见的场景,因此我抽出了一个小工具CanvasPainter.js,囊括在小程序内canvas画图基本需求:

  • 用配置形式绘图(暂支持单行及多行文本,矩形,圆形,图片及圆形图片类型),以及支持后续预览及保存成图片,且皆为Promise格式。
  • canvas尺寸以一般设计稿的750px为准(可配),在不同屏幕机型下等比缩放。
  • 生成图片时,支持图片预下载,及在一个小程序周期内缓存图片下载的tmp路径。

demo地址

用法

使用也很简单~无需染指到wx.各种api,直接配置初始化+调用对应方法即可,一条龙服务美滋滋~

import CanvasPainter from './CanvasPainter';const config = [
{type:'rect, width: 640, height: 560, x: 0, y: 0, color: '#fff'},
{type: 'text', text: '测试文本', color: '#1499f8',size: 50, x: 30,y: 100}
]// 初始化
const painter = new CanvasPainter({canvasId: `canvasId`,context: this, // 组件内使用需传thisconfig //画图路径
});
painter.loadImgInAdvance(); //预下载图片到本地;如不主动调用,则draw的时候会再下载。// 更新画图路径
painter.resetConfig(newConfig);// 画图
painter.draw().then(() => {console.log('画图完成');
}).catch(e => {console.log('生成图片失败', e);
});// 预览
painter.preview();// 保存
painter.save().then(() => {console.log('保存完成');
}).catch(e => {console.log('保存失败', e);
});
复制代码

开发过程中遇到的要点记录如下:

  • 如何等比缩放

    因为canvas绘图时的长度单位为px,所以可以利用小程序的canvas.scale()来解决。

    const scale = wx.getSystemInfoSync().windowWidth / 750;
    this.ctx.scale(scale, scale); // 这样可以实现以750px尺寸的ui图等比缩放
    复制代码
  • 绘制图片预下载及缓存

    调用ctx.drawImage()时,图片需要先下载到本地临时路径,这一步耗时较长,所以建议前置进行。临时路径的有效期为一个小程序周期,所以完全可以缓存本地临时路径。这样重复生成canvas时只会下载动态图片,复用固定图片路径,避免重复下载~

    另外图片域名需配置在小程序后台,为避免意外,下载图片前应先对图片url做一次校验,校验失败直接跳过下载或换用兜底图。

  • 下载图片到本地

    在save图片前,需要先调用wx.getSetting()来获取用户是否已允许下载图片到本地权限,或是唤起请求权限弹窗。如果权限被拒绝,则最好给出toast提示,同时把下载按钮重置为open-type="openSetting",用户再次点击时,引导跳转至授权页面。

另外使用时也有两点不温馨提示:

  • canvas组件显隐控制

    不建议将canvas组件用wx:if控制显隐,因为将canvas组件挂载至页面后,要经过200ms左右的延迟才能draw()成功。建议直接用display:none/block来控制,这样也方便实现图片预下载。

  • 结合业务抽离组件

    建议结合当前业务将生成分享图功能进一步抽离成组件,包括内嵌点击canvas预览图片,保存canvas为图片按钮(兼容未授权下载图片跳转授权页情况)等。亦可更灵活的自由控制画图及更新画图的时机。

注意到这两点后,就可以分分钟撸出一个动态生成图啦~

附:完整API

初始化

new CanvasPainter(options)

options

  • canvsId: canvas-id。

  • context: canvas使用时上下文,在组件内使用时传入this即可。

  • config: Array[]。绘图路径。支持类型如下:

    • rect 矩形

      完整配置:{type: 'rect',width: 640,height: 560,x:0,y:0,color: '#fff', // fill下为填充颜色,storke下为笔迹颜色stroke(可选): true, // 代表模式为fill还是stroke。默认false,即fill状态。round(可选): true, // 代表是否为圆形。默认false。
      }
      复制代码
    • text 文本

      完整配置:{type: 'text',x:0,y:30,color: '#fff', // 字色font: 'xx', // 字体size: 20, //字号align: 'center', //对齐。默认left。decoration(可选): 'line-through', // 暂时只有中划线模式哈哈哈
      }
      复制代码
    • multiline_text 多行文本

      完整配置:{type: 'multiline_text',line_limit: 30, //每行字数line_height: 20, //行高... //其余都与text一致
      }
      复制代码
    • image 图片

      完整配置:{type: 'image',url: '', //图片路径x: '', y: '', width: '', height:'',round(可选): true, // 圆形。默认false。
      }
      复制代码
  • saleBase(可选): 按设计稿尺寸来,默认750。

预下载图片:

canvasPainter.loadImgInAdvance()。可在实例化CanvasPainter后立即调用。

绘图:

canvasPainter.draw()

预览大图:

canvasPainter.preview()

保存成图片:

canvasPainter.save()

更改config:

canvasPainter.resetConfig(newConfig)

来~打包实现小程序动态分享图一条龙服务( ¨̮ )相关推荐

  1. 微信小程序绘制分享图

    微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...

  2. h5是可以一键打包小程序的_H5手机网站封装打包微信小程序并实现分享及微信支付...

    手机网站打包小程序教程,生成小程序,网页版小程序  打包微信小程序,H5封装成微信小程序. 微信小程序开发一般分为2种方式,一种就是原生开发小程序,一种是将手机网站打包成小程序. 原生开发小程序成本较 ...

  3. 友盟分享小程序_来啦!小程序支持分享朋友圈!

    朋友圈是微信最大的流量池,小程序支持分享到朋友圈是开发者们期待已久的功能.上线4年的小程序,为什么现在才能分享朋友圈?后续还需要注意哪些问题?小程序未来还会继续开放相关功能吗?文章从小程序的当前发展现 ...

  4. 小程序生成图片分享朋友圈

    小程序生成图片分享朋友圈 小程序开发者都希望自己的小程序得以广泛传播,因为不少小程序都设计了很多转发激励行为,但分享小程序到朋友圈(或其他外部平台)一直是一个难题.一个常见但方案就是生成分享海报.分享 ...

  5. 小程序动态class_微盛小程序“圈子动态”来了!仿朋友圈发布动态,引流拓客神器...

    微盛小程序"圈子动态",是一款和微信朋友圈有着相似功能,支持用户动态发布.帖子分享.点赞.评论等,能够集合小程序用户于一个圈子,给他们提供分享商品.交流沟通的平台,帮助商家提高客户 ...

  6. 小程序分享到朋友圈功能_微信小程序开放分享到朋友圈功能

    2020年7月7日(据说是6日深夜),一个很特别的日子,微信低调地放开了一个功能:微信小程序"分享到到朋友圈",这个看似微小的变化,对微信小程序来说意义重大. 用fenng大的话说 ...

  7. 微信小程序-动态验证码

    微信小程序-动态验证码 一.创建自定义组件verification-code 二.在index页面使用 一.创建自定义组件verification-code verification-code.js ...

  8. 微信小程序记录用户行为浏览记录和停留时间以及小程序全局分享

    微信小程序记录用户行为浏览记录和停留时间以及小程序全局分享 项目需求 1.后台统计一个用户在我们小程序的每个页面的停留时间 2,前台用户可以在个人中心看到自己的分享记录以及多少人查看 需求分析 需求一 ...

  9. 微信小程序如何分享到朋友圈

    微信小程序之前的分享是不支持直接分享到朋友圈的,之前分享的处理方式一般都是通过canvas生成分享海报,然后将生成的海报图发送到朋友圈中来达到分享的目的.不过从基础库 2.11.3 开始,分享朋友圈的 ...

最新文章

  1. python、C++ 中通过OpenCV的DNN模块使用YoloV4
  2. 甲骨文第四财季SAAS和PAAS收入增长66%
  3. Uncaught (in promise) Error: Request failed with status code 500
  4. 算法竞赛入门经典(第二版) | 例题5-2 木块问题 (紫皮书牛啤!)(UVa101,The Blocks Problem)
  5. 在ubuntu 12.04上安装tomcat 7.40
  6. Nhibernate+MVC开发日志
  7. python禁用警告
  8. 子组件向父组件传值_vue父子组件传值
  9. Oracle数据库sys和system用户的默认密码及如何修改密码
  10. VS2005精简版(二)
  11. 阿里云Maven配置方案
  12. 读河南干旱帖有感而发的一天(20191006)
  13. 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求...
  14. 关于洗牌的研究(六)——从数学到魔术之完美洗牌
  15. mysql注入实验报告_网络安全实验报告 第二章
  16. Ruoyi框架学习总结--总览篇
  17. Java迷你共享单车系统(面向对象作业)
  18. python基础选择题库_智慧树题库Python基础期末答案2020年免费
  19. GPS卫星同步时钟,GPS卫星时钟,GPS时钟
  20. 移动硬盘在计算机中不显示数据能恢复,移动硬盘在电脑上不显示怎么办?分享常用电脑知识...

热门文章

  1. 使用马尔可夫链构建文本生成器
  2. 计算机切换器鼠标反应慢,鼠标速度切换器,每鼠标配置速度设置 | MOS86
  3. 如何简洁高效地布局51单片机程序(多文件)
  4. Mac下完美利用雷蛇鼠标的多个功能按键(解决雷蛇Win键组合键无法映射问题)
  5. 批量裁剪高光谱图片使其大小可以被32整除存储裁剪后的图片图片名与原图片相同
  6. 带宽和宽带的区别是什么?底层原理是什么?
  7. MySQL按字符串hash分区_Mysql分区
  8. Linux导入cer证书
  9. 必读!ILRuntime来实现热更新的优与劣!
  10. 李彦宏造神路线揭秘:23万粉丝超越马云李开复