小程序生成海报,easy-canvas, painting参数使用demo
微信小程序不支持直接分享到朋友圈简直是一个大坑,最开始自己写了一个原始版本的canvas海报生成方式,结果发现生成的海报不是变形就是不适配所有屏幕,着实头疼了不少时间,前端实在太菜,偶然下载了一个电商小程序,发现其中使用的海报生成组件着实亮瞎我的近视眼,研究了下,简直是生成海报的一大福音。
组件名称:easy-canvas
组件GitHub开源地址:https://github.com/AfanSama/easy-canvas
组件实战效果图:
组件使用方式【复制于作者说明】:
git clone https://github.com/AfanSama/easy-canvas
到本地把
components
中的easy-canvas
拷贝到自己项目下。在使用页面注册组件
{"usingComponents": {"easy-canva": "/components/easy-canva/easy-canva"} }
在页面
**.wxml
文件中加入如下代码<easy-canvas painting="{{painting}}" bind:getImage="eventGetImage"/>
painting
是需要传入的json
。getImage
方法是绘图完成之后的回调函数,在event.detail
中返回绘制完成的图片地址。
组件参数【复制于作者说明】:
数据对象的第一层需要三个参数: width
、height
、mode
、views
。配置中所有的数字都是没有单位的。这就意味着 canvas
绘制的是一个比例图。具体显示的大小直接把返回的图片路径放置到 image
标签中即可。
mode
可选值有 same
, 默认值为空,常规下尽量不要使用。如要使用请看 Q&A的第1点。
当前可以绘制3种类型的配置: image
、text
、rect
、roundrect
。配置的属性基本上使用的都是 css
的驼峰名称,还是比较好理解的。
image(图片)
属性 | 含义 | 默认值 | 可选值 |
---|---|---|---|
url |
绘制的图片地址,可以是本地图片,如:/images/1.jpeg
|
||
top | 左上角距离画板顶部的距离 | ||
left | 左上角距离画板左侧的距离 | ||
width | 要画多宽 | 0 | |
height | 要画多高 | 0 | |
borderRadius | 是否圆形 | 0 | true |
opacity | 图片透明度 | 100 | 1-100(对应百分比) |
text(文本)
属性 | 含义 | 默认值 | 可选值 |
---|---|---|---|
content | 绘制文本 | ''(空字符串) | |
color | 颜色 | black | |
fontSize | 字体大小 | 16 | |
textAlign | 文字对齐方式 | left | center、right |
lineHeight | 行高,只有在多行文本中才有用 | 20 | |
top | 文本左上角距离画板顶部的距离 | 0 | |
left | 文本左上角距离画板左侧的距离 | 0 | |
breakWord | 是否需要换行 | false | true |
MaxLineNumber |
最大行数,只有设置 breakWord: true ,当前属性才有效,超出行数内容的显示为...
|
2 | |
width |
和 MaxLineNumber 属性配套使用,width 就是达到换行的宽度
|
||
bolder | 是否加粗 | false | true |
textDecoration | 显示中划线、下划线效果 | none | underline(下划线)、line-through(中划线) |
rect (矩形,线条)
属性 | 含义 | 默认值 | 可选值 |
---|---|---|---|
background | 背景颜色 | black | |
top | 左上角距离画板顶部的距离 | ||
left | 左上角距离画板左侧的距离 | ||
width | 要画多宽 | 0 | |
height | 要画多高 | 0 | |
shadowBlur | 阴影模糊 | 0 | |
shadowColor | 阴影颜色 |
roundrect(圆角矩形)
属性 | 含义 | 默认值 | 可选值 |
---|---|---|---|
background | 背景颜色 | black | |
top | 左上角距离画板顶部的距离 | ||
left | 左上角距离画板左侧的距离 | ||
width | 要画多宽 | 0 | |
height | 要画多高 | 0 | |
radius | 圆角度数 | 0 | |
shadowBlur | 阴影模糊 | 0 | |
shadowColor | 阴影颜色 |
项目所需数据:产品相关信息,如产品名,产品价格,假使我们已经有了产品id,并获取到了产品信息,赋值于product_info
项目核心参数:封装当前的产品id到菊花码中,用以其他人扫码后能直接进入对应产品详情
开始步骤:onload首先应获取对应二维码
获取菊花码有三个接口,生成的个数,应用场景分别不同,因为涉及产品分享,这个需要生成的个数不能限制,开发传送门:
wxacode.getUnlimited接口生成的个数不限,开发文档
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html
返回数据:会直接返回图片二进制内容
注意:
- POST 参数需要转成 JSON 字符串,不支持 form 表单提交。
- 接口只能生成已发布的小程序的二维码
- 调用分钟频率受限(5000次/分钟),如需大量小程序码,建议预生成
服务端调用接口生成方式:生成的符合规范的base64数据,接下来就需要前端去处理即可。
public function get_eq(){$ACCESS_TOKEN = $this->get_all_access_token(); //全局调用token,自行获取并存储$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$ACCESS_TOKEN}";$array = ['page' => I("page"),'scene' => I("scene"),'is_hyaline' => true,];$eq_info = $this->_requestPost($url,json_encode($array),'post');$base64_image ="data:image/jpeg;base64,".base64_encode($eq_info);$back_array = ['img_url' => $base64_image];return $this->renderSuccess(compact('back_array'));
}public function _requestPost($url, $data, $ssl=true) {//curl完成$curl = curl_init();//设置curl选项curl_setopt($curl, CURLOPT_URL, $url);//URL$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';curl_setopt($curl, CURLOPT_USERAGENT, $user_agent);//user_agent,请求代理信息curl_setopt($curl, CURLOPT_AUTOREFERER, true);//referer头,请求来源curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间//SSL相关if ($ssl) {curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//禁用后cURL将终止从服务端进行验证curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//检查服务器SSL证书中是否存在一个公用名(common name)。}// 处理post相关选项curl_setopt($curl, CURLOPT_POST, true);// 是否为POST请求curl_setopt($curl, CURLOPT_POSTFIELDS, $data);// 处理请求数据// 处理响应结果curl_setopt($curl, CURLOPT_HEADER, false);//是否处理响应头curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//curl_exec()是否返回响应结果// 发出请求$response = curl_exec($curl);if (false === $response) {echo '<br>', curl_error($curl), '<br>';return false;}curl_close($curl);return $response;
}
获取对应菊花码:
Page({/*** 页面的初始数据*/data: {goods_id:1,eq_img:'',pro_path:'',shareImage:'',painting: {},pop:false,},onShow:function(){let _this = this;_this.get_eq();
},//获取二维码
get_eq:function(){let _this = this;App._get('wxapp/get_eq', {page:'pages/goods/index',scene:'goods_id='+_this.data.goods_id}, function(result) {/*处理base64图片*/const fsm = wx.getFileSystemManager();const FILE_BASE_NAME = 'tmp_base64src';function base64src(base64data) {return new Promise((resolve, reject) => {const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];if (!format) {reject(new Error('ERROR_BASE64SRC_PARSE'));}const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;const buffer = wx.base64ToArrayBuffer(bodyData);fsm.writeFile({filePath,data: buffer,encoding: 'binary',success() {console.log(filePath)_this.setData({eq_img:filePath});resolve(filePath);},fail() {reject(new Error('ERROR_BASE64SRC_WRITE'));},});});};base64src(result.data.back_array.img_url);});
},
至此,我们需要的大部分数据都获取到了
wxss:
/*邀请组件*/
.map-pop{position: fixed;bottom: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, .6);overflow: hidden;padding: 20rpx 30rpx;box-sizing: border-box; z-index: 999;}
.share-image {width: 560rpx;height: 740rpx;margin: 200rpx 66rpx 30rpx;}
.save{width:560rpx;height:70rpx;line-height:70rpx;font-size:30rpx;margin-bottom:30rpx;}
.clone{width:560rpx;height:70rpx;line-height:70rpx;font-size:30rpx;}
js:
//触发生成海报generatePoster: function () {this.setData({pop: true});console.log(this.data.shareImage);if (this.data.shareImage == '') {wx.showLoading({title: '生成中'});this.eventDraw();}},//生成海报eventDraw: function () {let _this = this,shop_price = _this.data.goods.shop_price, //产品价格goods_name = _this.data.goods.goods_name, //产品名称pro_path = _this.data.goods.original_img; //产品图片eq_img = _this.data.eq_img, //二维码if (_this.data.eq_img == '') {wx.showLoading({title: '二维码还未生成,请重试'});return false;}else{_this.setData({painting: {width: 560,height: 740,clear: true,views: [{type: 'rect',top: 0,left: 0,width: 560,height: 740,background:'#ffffff'},{type: 'image',url: pro_path,top: 15,left: 15,width: 530,height: 530},{type: 'image',url: eq_img,top: 575,left: 410,width: 125,height: 125},{type: 'image',url: '../../images/logo.png',top: 575,left: 20,width: 125,height: 125},{type: 'text',content: goods_name,fontSize: 24,lineHeight: 34,color: '#727272',breakWord:true,MaxLineNumber:2,width:200,top: 570,left: 160,bolder: true},{type: 'text',content: '惊喜价:¥'+shop_price,fontSize: 30,lineHeight: 30,color: '#d13106',top: 650,left: 160,bolder: true},{type: 'text',content: '长按图片识别图中二维码',fontSize: 22,lineHeight: 30,color: '#727272',top: 700,left: 280,textAlign:'center'},]}});}},//关闭海报层clone: function() {this.setData({pop: false});},//获取图片eventGetImage: function (event) {wx.hideLoading()const { tempFilePath, errMsg } = event.detailif (errMsg === 'canvasdrawer:ok') {this.setData({shareImage: tempFilePath})}},//保存图片eventSave: function () {wx.saveImageToPhotosAlbum({filePath: this.data.shareImage,success(res) {App.common.successToShow('保存图片成功');}})},
至此,点击分享:
小程序生成海报,easy-canvas, painting参数使用demo相关推荐
- 微信小程序生成海报 poster
原生小程序 canvas 小程序-canvas绘图并保存到系统相册 小程序导出朋友圈海报详细记录 逻辑清晰的说明了,原生小程序 canvas 绘制的步骤: 获取 Canvas.context 绘制背景 ...
- 微信小程序生成海报可保存海报和分享海报
最近因为小程序生成海报分享的问题头疼了很久,所以自己总结了一下供大家参考,可以放置用户头像姓名以及商品名称价格和二维码太阳码等,实测可用! 下载链接https://download.csdn.net/ ...
- 小程序生成海报并下载到本地图库
需求 小程序在海报页点需生成海报, 并下载图片到本机,同时, 下载的图片上有 名片信息, 和一个小程序太阳码图片. 思想 使用 canvas 来画出图片, 名片文本, 和小程序的太阳码 操作 在小程序 ...
- 小程序生成海报携带参数-云函数生成二维码
1. 逻辑代码 async qcFn() {console.log('生成海报');let that = thisconst houseId = this.data.houseDetail._idco ...
- 微信小程序生成海报带二维码功能
wxml文件 <view><text class='shareText'>生成海报分享至</text><view class='imgBox'>< ...
- 微信小程序生成海报中二维码-----长按识别不了问题及处理方案
> 问题描述: 小程序某个页面中点击按钮,想要生成带有二维码的图片,后续保存本地.生成图片后转发微信中,后长按图片不会出现识别图中二维码的选项问题. 一年前写过一个分享页,当时大部分可以识别,只 ...
- 微信小程序生成海报失败问题解决方法
很多业务需求需要获取到微信头像,然后用头像和二维码及其他背景图一起生成海报,进行分享.在部分机型会出现生成失败问题.以下是本人排除后发现产生问题的原因和解决方法. 1.安卓机提示downloadFil ...
- 小程序生成分享海报php配置,小程序生成海报保存分享图片完全指南(包括:头像,文字)...
业务在小程序中生成海报(包括用户头像和自定义文字)并且保存到本地 实现思路 利用canvas画布,把用户头像和自定义文字定位好,用户点击按钮保存到本地 注意事项 难点 小程序canvas不支持自定义宽 ...
- 微信小程序生成海报下载到本地手机本地
里面有注释,这个就不详细说了,把对应的的图片路径换掉,就可以完成运行了 index.js 在这里有一个问题,所以在ctx.draw里面设置了一个定时器,因为官方文档说在ctx.draw回调中会绘制完成 ...
最新文章
- GO学习第一天——环境搭建
- 网站设计流程图(来源于网络)
- 虹口区巡检机器人_上海巡检机器人
- python处理列表中字典_Python列表嵌套字典的时候,如果要删除列表中其中一个字典要如何操作...
- mfc中主窗体显示(任务栏上方显示)
- 【Python 必会技巧】使用 Python 追加写入 json 文件或更改 json 文件中的值
- python开发环境管理:pip和virtualenv
- 垂直电商独立站,到底有何优势?
- 速升级!SonicWall 3个已遭利用的严重0day 影响企业邮件安全设备
- Gartner公布2017年全球云存储魔力象限:阿里云跻身四强
- Steve Pavlina:如何ASAP找到人生目标?
- python一个下载小说的简易爬虫
- 【转】未来10年经济走向及发展趋势
- python爬虫--王者荣耀高清壁纸下载(多线程)
- yum.repos.d没有这个文件和目录解决方法
- 面向ChatGPT编程有多牛逼
- AcWing-C/C++语法基础【合集1】
- 【NS2】cygwin+NS2.29安装之道 (转载)
- 如何用好MindManager中的时间轴模板
- 中国银行人工智能行业现状与发展趋势及前景预测报告