微信小程序 | 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({}) 下载,生成图片的临时路径之后再绘制;
下边是封装的 导出高清图,并且显示预览图片的使用场景,
const qr = require('../qrcode')
/**
* system.windowWidth 可使用窗口宽度
* system.windowHeight 可使用窗口高度
*/
const system = wx.getSystemInfoSync()
const w = 562
const h = 1000
function rpx(n, sizeType) {
if (sizeType === 'save') {
return n
} else {
return n * system.windowWidth / 750
}
}
function downloadImg (link) {
return new Promise((resolve, reject) => {
wx.downloadFile({
url: link,
success: res => {
if (res.statusCode === 200) {
resolve(res.tempFilePath)
}
}
})
})
}
module.exports = {
/**
* @param data
* data.title
* data.price
* data.unit
* data.url
* @param option.sizeType 显示: display, 保存: save
*/
draw (ctx, data, option = {}) {
var sizeType = option.sizeType === 'save' ? 'save' : 'display'
return new Promise((resolve, reject) => {
var bg_url = 'https://static001-test.geekbang.org/resource/image/c5/63/c54a6fde89dd9897a321a070a0555363.jpg'
var avatar_url = 'https://static001-test.geekbang.org/resource/image/35/65/35012b5a4b7576faaa1e565da142a565.png'
var column_url = 'https://static001-test.geekbang.org/resource/image/35/65/35012b5a4b7576faaa1e565da142a565.png'
var code_url ='https://static001-test.geekbang.org/resource/image/e6/07/e618015af89d6ffcf37a6d148dff0b07.png'
var bg_path = ''
var avarar_path = ''
var col_path = ''
var code_path = ''
downloadImg(bg_url) // 下载背景
.then((path)=> {
bg_path = path
downloadImg(avatar_url) // 下载头像
.then((path) => {
avarar_path = path
downloadImg(column_url) // 下载专栏图片
.then((path) => {
col_path = path
downloadImg(code_url) // 下载小程序菊花图
.then((path) => {
code_path = path
ctx.beginPath()
ctx.drawImage(bg_path, 0, 0, rpx(w, sizeType), rpx(h, sizeType)) // 画 背景
ctx.save()
ctx.arc( rpx(35 + 75/2,sizeType), rpx(44 +75/2, sizeType), rpx(75/2, sizeType), 0, 2 * Math.PI)
ctx.clip()
ctx.drawImage(avarar_path, rpx(35,sizeType), rpx(44, sizeType), rpx(75, sizeType), rpx(75, sizeType)) // 画 头像
ctx.restore()
ctx.drawImage(col_path, rpx(58,sizeType), rpx(305, sizeType), rpx(152, sizeType), rpx(152, sizeType)) // 画 专栏封面
ctx.drawImage(code_path, rpx(219,sizeType), rpx(710, sizeType), rpx(129, sizeType), rpx(129, sizeType)) // 画 菊花码
// 基础
ctx.setTextAlign('left')
ctx.setTextBaseline('normal')
// 昵称 |<--
ctx.setFillStyle('#Af7628')
ctx.setFontSize(rpx(22, sizeType))
ctx.fillText('小原-极客时间', rpx(118,sizeType), rpx(81, sizeType)) // 微信bug 参数分别是 ‘string’ 左下角x坐标 左下y坐标
// 专栏名称 |<--
ctx.setFontSize(rpx(28, sizeType))
ctx.setFillStyle('#916a34')
ctx.fillText('左耳听风', rpx(227,sizeType), rpx(332, sizeType))
// 作者信息 |<--
ctx.setFontSize(rpx(19, sizeType))
ctx.setFillStyle('#ad936f')
ctx.fillText('陈皓 网名“左耳朵耗子”,资深...', rpx(227,sizeType), rpx(363, sizeType), rpx(296, sizeType))
// 学习人数 |<--
ctx.setFontSize(rpx(18, sizeType))
ctx.setFillStyle('#ad936f')
ctx.fillText('204人已参加学习', rpx(227,sizeType), rpx(390, sizeType), rpx(263, sizeType))
// 还差 2 人 |<--
ctx.setFontSize(rpx(32, sizeType))
ctx.setFillStyle('#B67e34')
ctx.fillText('2', rpx(207,sizeType), rpx(599, sizeType), rpx(31, sizeType))
// 原价 -->|
ctx.setTextBaseline('bottom')
ctx.setTextAlign('right')
ctx.setFontSize(rpx(17,sizeType))
ctx.setFillStyle('#cd9e5e')
ctx.fillText('原价 ¥299', rpx(489, sizeType), rpx(422, sizeType), rpx(115, sizeType))
// 现价 -->|
ctx.setFontSize(rpx(32,sizeType))
ctx.setFillStyle('#cd9e5e')
ctx.setTextBaseline('bottom')
ctx.fillText('¥199', rpx(489,sizeType), rpx(459, sizeType), rpx(118, sizeType))
// 状态 -->|<--
ctx.setTextAlign('center')
ctx.setFontSize(rpx(35,sizeType))
ctx.setFillStyle('#9d5c00')
ctx.fillText('拼团进行中', rpx(w,sizeType) / 2, rpx(239, sizeType))
ctx.draw()
resolve()
})
})
})
})
})
},
/**
* @param option.sizeType 显示: display, 保存: save
*/
getSize (data, option = {}) {
var sizeType = option.sizeType === 'save' ? 'save' : 'display'
return {width: rpx(w, sizeType), height: rpx(h, sizeType)}
},
getInfo () {
return {
btnName: '保存分享海报'
}
}
}
微信小程序 | canvas绘图的更多相关文章
- 微信小程序 canvas 绘图问题总结
业务中碰到微信小程序需要生成海报进行朋友圈分享,这个是非常常见的功能,没想到实际操作的时候花了整整一天一夜才搞好,微信的 canvas 绘图实在是太难用了,官方快点优化一下吧. 业务非常简单,只需要将 ...
- uniapp微信小程序canvas绘图插入网络图片不显示
网络图片缓存 在uni中wx可以用uni代替 无区别: 先把要插入的网络图片缓存(getImageInfo); let context = uni.createCanvasContext('first ...
- 原创:WeZRender:微信小程序Canvas增强组件
WeZRender是一个微信小程序Canvas增强组件,基于HTML5 Canvas类库ZRender. 使用 WXML: <canvas style="width: 375px; h ...
- 微信小程序 canvas 字体自动换行(支持换行符)
微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈 https://github.com/richard1015/News 微信IDE演示代码https://developers.w ...
- 微信小程序-canvas绘制文字实现自动换行
在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...
- 微信小程序--canvas画布实现图片的编辑
技术:微信小程序 概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...
- 微信小程序canvas生成并保存图片
---恢复内容开始--- 微信小程序canvas生成并保存图片,具体实现效果如下图 实现效果需要做以下几步工作 一.先获取用户屏幕大小,然后才能根据屏幕大小来定义canvas的大小 二.获取图 ...
- 技术博客--微信小程序canvas实现图片编辑
技术博客--微信小程序canvas实现图片编辑 我们的这个小程序不仅仅是想给用户提供一个保存和查找的平台,还希望能给用户一个展示自己创意的舞台,因此我们实现了图片的编辑部分.我们对对图片的编辑集成了很 ...
- 微信 小程序 canvas
测试手机为IPHONE6,开发者工具版本0.10.102800.开发者工具0.11.112301版本也一样 微信小程序里的canvas 非 h5 canvas有很多不一样的地方,以下把微信小程序的ca ...
随机推荐
- fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能
用vue写的 显示,隐藏 hide(){ this.canvas.getActiveObject().set('opacity', 0).setCoords(); this.canvas.reques ...
- Js中判断变量存不存在的问题
前面写过jquery对象存在与否的判断.现在谈下Js中判断变量存不存在的问题. 如果这样if(!a),当变量a在js中没有申明时,就会报错,那么接下去的代码将不会被执行.注意,这种判断只要变量申明过, ...
- Java Web中的mapper,service,controller,model
Java Web中的mapper,service,controller,model作用分别是:java web中mapper是对象持久化映射层,一般会继承ibatis或者mybatisservive是 ...
- struct timeval和gettimeofday
struct timeval和gettimeofday() struct timeval结构体在time.h中的定义为: struct timeval { time_t tv_sec; /* Seco ...
- GDI Bezier 样条曲线(7)
Bezier 样条曲线 Bezier 样条曲线使用四个点来定义:两个端点(起点和终点)和两个控点(用于使其不同程度地弯曲). 绘制 Bezier 样条曲线 使用 PolyBezier 函数和 Poly ...
- Tab 切换效果
今天写的两个小效果都是为了测试我写的单参函数,结果还是有点成功的~~此处是不是想发表情包! Tab效果很简单,这里我就不赘述了,直接上代码: html代码: <div class="c ...
- [TJOI2018]xor
题目大意: 有一棵树,根节点为1.每个点有点权.有两种操作. 1. 求节点x所在子树中点权与y异或的最大值.2. 求x到y的路径上点权与z异或的最大值. 解题思路: 可持久化字典树. 对于第一种操作, ...
- Python 绘制2016世界GDP地图
2016世界GDP地图 从https://datahub.io/core/gdp#data下载得到json文件. # country_code.py 获取国家二字代码 # 从pygal.maps.wo ...
- NOIP2018提高组金牌训练营——动态规划专题
NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...
- 2、深入学习基本结构——CNN
这节课主要简单复习一下CNN 从图中例子,1.3共享参数,2.4共享. 要看明白以上参数. 后面就是举例了. 比如声音信号 下面是zero padding 下面是pooling 还可以有mass po ...