微信小程序 | canvas绘图

1、新的尺寸单位 rpx

  rpx(responsive pixel): 可以根据屏幕宽度进行自适应。

  规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

  设备 rpx换算px (屏幕宽度/750); px换算rpx (750/屏幕宽度)

2、小程序canvas总结

  小程序绘制的单位是px, 基础知识点请参考文档 ;

  canvas中存在一个坐标系,二维的,左上角坐标系(0,0);

  小程序 canvas 层级在视图中是最高的,高于一般的<view></view>, 覆盖 canvas 的层级用 cover-view

  canvas 绘制在线图片链接,需要匹配合法域名;且需要先使用 wx.downloadFile({}) 下载,生成图片的临时路径之后再绘制;

  下边是封装的 导出高清图,并且显示预览图片的使用场景,  

  1 const qr = require(‘../qrcode‘)
  2
  3 /**
  4  * system.windowWidth 可使用窗口宽度
  5  * system.windowHeight 可使用窗口高度
  6  */
  7 const system = wx.getSystemInfoSync()
  8 const w = 562
  9 const h = 1000
 10
 11 function rpx(n, sizeType) {
 12   if (sizeType === ‘save‘) {
 13     return n
 14   } else {
 15     return n * system.windowWidth / 750
 16   }
 17 }
 18
 19 function downloadImg (link) {
 20   return new Promise((resolve, reject) => {
 21     wx.downloadFile({
 22       url: link,
 23       success: res => {
 24         if (res.statusCode === 200) {
 25           resolve(res.tempFilePath)
 26         }
 27       }
 28     })
 29   })
 30 }
 31
 32 module.exports = {
 33   /**
 34    * @param data
 35    *   data.title
 36    *   data.price
 37    *   data.unit
 38    *   data.url
 39    * @param option.sizeType 显示: display, 保存: save
 40    */
 41   draw (ctx, data, option = {}) {
 42     var sizeType = option.sizeType === ‘save‘ ? ‘save‘ : ‘display‘
 43     return new Promise((resolve, reject) => {
 44
 45       var bg_url = ‘https://static001-test.geekbang.org/resource/image/c5/63/c54a6fde89dd9897a321a070a0555363.jpg‘
 46       var avatar_url = ‘https://static001-test.geekbang.org/resource/image/35/65/35012b5a4b7576faaa1e565da142a565.png‘
 47       var column_url = ‘https://static001-test.geekbang.org/resource/image/35/65/35012b5a4b7576faaa1e565da142a565.png‘
 48       var code_url =‘https://static001-test.geekbang.org/resource/image/e6/07/e618015af89d6ffcf37a6d148dff0b07.png‘
 49
 50       var bg_path = ‘‘
 51       var avarar_path = ‘‘
 52       var col_path = ‘‘
 53       var code_path = ‘‘
 54
 55       downloadImg(bg_url) // 下载背景
 56       .then((path)=> {
 57         bg_path = path
 58         downloadImg(avatar_url) // 下载头像
 59         .then((path) => {
 60           avarar_path = path
 61           downloadImg(column_url) // 下载专栏图片
 62           .then((path) => {
 63             col_path = path
 64             downloadImg(code_url) // 下载小程序菊花图
 65             .then((path) => {
 66               code_path = path
 67               ctx.beginPath()
 68               ctx.drawImage(bg_path, 0, 0, rpx(w, sizeType), rpx(h, sizeType)) // 画 背景
 69               ctx.save()
 70               ctx.arc( rpx(35 + 75/2,sizeType), rpx(44 +75/2, sizeType), rpx(75/2, sizeType), 0, 2 * Math.PI)
 71               ctx.clip()
 72               ctx.drawImage(avarar_path, rpx(35,sizeType), rpx(44, sizeType), rpx(75, sizeType), rpx(75, sizeType)) // 画 头像
 73               ctx.restore()
 74               ctx.drawImage(col_path, rpx(58,sizeType), rpx(305, sizeType), rpx(152, sizeType), rpx(152, sizeType)) // 画 专栏封面
 75               ctx.drawImage(code_path, rpx(219,sizeType), rpx(710, sizeType), rpx(129, sizeType), rpx(129, sizeType)) // 画 菊花码
 76               // 基础
 77               ctx.setTextAlign(‘left‘)
 78               ctx.setTextBaseline(‘normal‘)
 79               // 昵称 |<--
 80               ctx.setFillStyle(‘#Af7628‘)
 81               ctx.setFontSize(rpx(22, sizeType))
 82               ctx.fillText(‘小原-极客时间‘, rpx(118,sizeType), rpx(81, sizeType)) // 微信bug 参数分别是 ‘string’ 左下角x坐标 左下y坐标
 83               // 专栏名称 |<--
 84               ctx.setFontSize(rpx(28, sizeType))
 85               ctx.setFillStyle(‘#916a34‘)
 86               ctx.fillText(‘左耳听风‘, rpx(227,sizeType), rpx(332, sizeType))
 87               // 作者信息 |<--
 88               ctx.setFontSize(rpx(19, sizeType))
 89               ctx.setFillStyle(‘#ad936f‘)
 90               ctx.fillText(‘陈皓 网名“左耳朵耗子”,资深...‘, rpx(227,sizeType), rpx(363, sizeType), rpx(296, sizeType))
 91               // 学习人数 |<--
 92               ctx.setFontSize(rpx(18, sizeType))
 93               ctx.setFillStyle(‘#ad936f‘)
 94               ctx.fillText(‘204人已参加学习‘, rpx(227,sizeType), rpx(390, sizeType), rpx(263, sizeType))
 95               // 还差 2 人 |<--
 96               ctx.setFontSize(rpx(32, sizeType))
 97               ctx.setFillStyle(‘#B67e34‘)
 98               ctx.fillText(‘2‘, rpx(207,sizeType), rpx(599, sizeType), rpx(31, sizeType))
 99               // 原价  -->|
100               ctx.setTextBaseline(‘bottom‘)
101               ctx.setTextAlign(‘right‘)
102               ctx.setFontSize(rpx(17,sizeType))
103               ctx.setFillStyle(‘#cd9e5e‘)
104               ctx.fillText(‘原价 ¥299‘, rpx(489, sizeType), rpx(422, sizeType), rpx(115, sizeType))
105               // 现价  -->|
106               ctx.setFontSize(rpx(32,sizeType))
107               ctx.setFillStyle(‘#cd9e5e‘)
108               ctx.setTextBaseline(‘bottom‘)
109               ctx.fillText(‘¥199‘, rpx(489,sizeType), rpx(459, sizeType), rpx(118, sizeType))
110               // 状态 -->|<--
111               ctx.setTextAlign(‘center‘)
112               ctx.setFontSize(rpx(35,sizeType))
113               ctx.setFillStyle(‘#9d5c00‘)
114               ctx.fillText(‘拼团进行中‘, rpx(w,sizeType) / 2, rpx(239, sizeType))
115
116               ctx.draw()
117               resolve()
118             })
119           })
120         })
121       })
122
123     })
124   },
125   /**
126    * @param option.sizeType 显示: display, 保存: save
127    */
128   getSize (data, option = {}) {
129     var sizeType = option.sizeType === ‘save‘ ? ‘save‘ : ‘display‘
130     return {width: rpx(w, sizeType), height: rpx(h, sizeType)}
131   },
132   getInfo () {
133     return {
134       btnName: ‘保存分享海报‘
135     }
136   }
137 }

原文地址:https://www.cnblogs.com/wuhaoquan/p/9090335.html

时间: 2024-11-10 02:04:44

微信小程序 | canvas绘图的相关文章

微信小程序 canvas 绘图问题总结

业务中碰到微信小程序需要生成海报进行朋友圈分享,这个是非常常见的功能,没想到实际操作的时候花了整整一天一夜才搞好,微信的 canvas 绘图实在是太难用了,官方快点优化一下吧. 业务非常简单,只需要将用到的图片,文案素材拼装到一张图片,保存到本地就可以了. 首先创建画布,将一张网上的图片画到画布上. const ctx = wx.createCanvasContext('shareCanvas'); ctx.drawImage("https://img3.doubanio.com/view/ph

微信 小程序 canvas

测试手机为IPHONE6,开发者工具版本0.10.102800 微信小程序里的canvas 非 h5 canvas有很多不一样的地方,以下把微信小程序的canvas叫做wxcanvas 下面全是我一点点测试出的干货,耐心看: 1.wxcanvas,不像h5canvas那样有width和height属性和width和height的style样式.他只有style样式,可以理解为他就是个框吧: 2.wxcanvas不要当成真的H5canvas,就当它是个div就行,画出范围的东西也是存在的,改变wi

微信小程序 canvas 生成随机验证码

https://blog.csdn.net/qq_16646819/article/details/81020245?utm_source=blogxgwz0 js 1 // pages/bind/bind.js 2 var app = getApp(); 3 var baseUrl = getApp().baseUrl; 4 var ctx; 5 Page({ 6 7 /** 8 * 页面的初始数据 9 */ 10 data: { 11 text: '', 12 }, 13 14 /** 15

微信小程序 canvas 文字自动换行

Page({ drawCanvas: function(ctx) {// 地址 ctx.setFontSize(14) ctx.setFillStyle('#9E7240') ctx.textAlign="center"; const txHash = this.data.info.txHash ? this.data.info.txHash : '暂无信息' this.drawText(ctx,txHash,187, 517 , 232,232) // 自动换行 ctx.draw()

微信小程序开源项目库汇总

微信小程序开源项目库汇总,里面集合了OpenDigg 上的优质的微信小程序开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wemark ★85 - 微信小程序Markdown渲染库 WeZRender ★36 - 微信小程序Canvas增强组件 wet

微信小程序UI组件、开发框架、实用库

UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wemark ★85 - 微信小程序Markdown渲染库 WeZRender ★36 - 微信小程序Canvas增强组件 wetoast ★21 - 仿照微信小程序提供的showToast功能 wxapp-charts ★20 - 微信小程序图表charts组件 WeiXinProject ★18 - 列

微信小程序image组件开发程序以及相关图片问题参考资料汇总

微信小程序image组件开发程序以及相关图片问题参考资料汇总,希望对大家小程序开发能有一定的参考和借鉴价值.以下汇总主要涉及到微信小程序image组件有关资源路径.缩放和剪裁模式等进行的探讨,无论是对微信小程序新手还是正在开发中的朋友都是很好的小程序学习资料. 微信小程序image组件必备基础知识: image组件默认宽度300px.高度225px image的属性mode有13种模式,其中4种是缩放模式,9种是裁剪模式 image组件开发教程汇总: 微信小程序自定义组件实现图片单指拖动.双指缩

[转] 扩展微信小程序框架功能

通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.112200)后, 移除了开发者工具对 ES6 中Promise 特性原生的支持, 需要引入第三方的 Promise 库. 扩展微信小程序框架功能(2)——Generator Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同. 扩展微信小程序框架功能(3)——函数功能增强

微信小程序框架集合

UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wemark ★85 - 微信小程序Markdown渲染库 WeZRender ★36 - 微信小程序Canvas增强组件 wetoast ★21 - 仿照微信小程序提供的showToast功能 wxapp-charts ★20 - 微信小程序图表charts组件 WeiXinProject ★18 - 列