效果图:

<view class='poste_box' id='canvas-container' style='opacity:{{opacity}}'><canvas canvas-id="myCanvas" style="width:100%;height:900rpx;" /><view class='wrapper_fuc'><button style='background-color:#fff;' class='btnshare iconfont icon-guanyu' open-type='share'> 微信好友</button><button style='background-color:#fff;' class='btn_item iconfont icon-guanyu' bindtap="saveShareImg"> 保存图片</button></view>
</view>page{background-color: #EDEEF2;background-image: url(https://www.cnblogs.com/images/cnblogs_com/520BigBear/1196074/t_dog.jpg);background-size: cover;background-position: center
}
.poste_box{width: 85%;margin: auto;margin-top: 50rpx;background-color: #fff;border: 1rpx solid #ddd;box-shadow:0px 0px  10px 5px #D8D7DD;
}
.savePoste{background-color: #FF8427;width: 90%;margin-left: auto;margin-right: auto;margin-top:30rpx;color: #fff;
}
.saveTitle{font-size: 25rpx;color: #666;width: 90%;margin-left: auto;margin-right: auto;margin-top: 20rpx;text-align: center;
}.wrapper_fuc{display: flex;justify-content: space-between
}//我在js中注释的代码很重要,实际开发中绘制商品海报必然是用网络图片,但经过多次尝试网络图片是不可以直接绘制在canvas画布上的,就必须要把他缓存下来,弄一个本地路径
wx.downloadFile

Page({data: {opacity:0,cardInfo: {avater: "https://www.cnblogs.com/images/cnblogs_com/520BigBear/1196074/t_dog.jpg", //需要https图片路径qrCode: "https://www.cnblogs.com/images/cnblogs_com/520BigBear/1196074/t_love.jpg", //需要https图片路径TagText: "大熊", //标签Name: '大熊', //姓名Position: "程序员鼓励师", //职位Mobile: "13888888888", //手机Company: "熊野有限公司", //公司}},onLoad: function () {this.getAvaterInfo();let that = thissetTimeout(function () {that.setData({opacity: 0.9});}, 1500);},/*** 先下载头像图片*/getAvaterInfo: function () {wx.showLoading({title: '生成中...',mask: true,});var that = this;wx.downloadFile({url: that.data.cardInfo.avater, //头像图片路径success: function (res) {wx.hideLoading();if (res.statusCode === 200) {var avaterSrc = res.tempFilePath; //下载成功返回结果that.getQrCode(avaterSrc); //继续下载二维码图片} else {wx.showToast({title: '头像下载失败!',icon: 'none',duration: 2000,success: function () {var avaterSrc = "";that.getQrCode(avaterSrc);}})}}})},/*** 下载二维码图片*/getQrCode: function (avaterSrc) {wx.showLoading({title: '生成中...',mask: true,});var that = this;wx.downloadFile({url: that.data.cardInfo.qrCode, //二维码路径success: function (res) {wx.hideLoading();if (res.statusCode === 200) {var codeSrc = res.tempFilePath;that.sharePosteCanvas(avaterSrc, codeSrc);} else {wx.showToast({title: '二维码下载失败!',icon: 'none',duration: 2000,success: function () {var codeSrc = "";that.sharePosteCanvas(avaterSrc, codeSrc);}})}}})},/*** 开始用canvas绘制分享海报* @param avaterSrc 下载的头像图片路径* @param codeSrc   下载的二维码图片路径*/sharePosteCanvas: function (avaterSrc, codeSrc) {wx.showLoading({title: '生成中...',mask: true,})var that = this;var cardInfo = that.data.cardInfo; //需要绘制的数据集合const ctx = wx.createCanvasContext('myCanvas'); //创建画布var width = "";wx.createSelectorQuery().select('#canvas-container').boundingClientRect(function (rect) {var height = rect.height;var right = rect.right;width = rect.width * 0.8;var left = rect.left + 5;ctx.setFillStyle('#fff');ctx.fillRect(0, 0, rect.width, height);//头像为正方形if (avaterSrc) {ctx.drawImage(avaterSrc, left, 20, width, width);ctx.setFontSize(14);ctx.setFillStyle('#fff');ctx.setTextAlign('left');}//标签if (cardInfo.TagText) {ctx.fillText(cardInfo.TagText, left + 20, width - 4);const metrics = ctx.measureText(cardInfo.TagText); //测量文本信息ctx.stroke();ctx.rect(left + 10, width - 20, metrics.width + 20, 25);ctx.setFillStyle('rgba(255,255,255,0.4)');ctx.fill();}//姓名if (cardInfo.Name) {ctx.setFontSize(14);ctx.setFillStyle('#000');ctx.setTextAlign('left');ctx.fillText(cardInfo.Name, left, width + 60);}//职位if (cardInfo.Position) {ctx.setFontSize(12);ctx.setFillStyle('#666');ctx.setTextAlign('left');ctx.fillText(cardInfo.Position, left, width + 85);}//电话if (cardInfo.Mobile) {ctx.setFontSize(12);ctx.setFillStyle('#666');ctx.setTextAlign('left');ctx.fillText(cardInfo.Mobile, left, width + 105);}// 公司名称if (cardInfo.Company) {const CONTENT_ROW_LENGTH = 24; // 正文 单行显示字符长度let [contentLeng, contentArray, contentRows] = that.textByteLength(cardInfo.Company, CONTENT_ROW_LENGTH);ctx.setTextAlign('left');ctx.setFillStyle('#000');ctx.setFontSize(10);let contentHh = 22 * 1;   for (let m = 0; m < contentArray.length; m++) {ctx.fillText(contentArray[m], left, width + 150 + contentHh * m);}}//  绘制二维码if (codeSrc) {ctx.drawImage(codeSrc, left + 160, width + 40, width / 3, width / 3)ctx.setFontSize(10);ctx.setFillStyle('#000');ctx.fillText("微信扫码或长按识别", left + 160, width + 150);}}).exec()setTimeout(function () {ctx.draw();wx.hideLoading();}, 1000)},/*** 多行文字处理,每行显示数量* @param text 为传入的文本* @param num  为单行显示的字节长度*/textByteLength(text, num) {let strLength = 0; // text byte lengthlet rows = 1;let str = 0;let arr = [];for (let j = 0; j < text.length; j++) {if (text.charCodeAt(j) > 255) {strLength += 2;if (strLength > rows * num) {strLength++;arr.push(text.slice(str, j));str = j;rows++;}} else {strLength++;if (strLength > rows * num) {arr.push(text.slice(str, j));str = j;rows++;}}}arr.push(text.slice(str, text.length));return [strLength, arr, rows] //  [处理文字的总字节长度,每行显示内容的数组,行数]},//点击保存到相册saveShareImg: function () {var that = this;wx.showLoading({title: '正在保存',mask: true,})setTimeout(function () {wx.canvasToTempFilePath({canvasId: 'myCanvas',success: function (res) {wx.hideLoading();var tempFilePath = res.tempFilePath;wx.saveImageToPhotosAlbum({filePath: tempFilePath,success(res) {// utils.aiCardActionRecord(19);wx.showModal({content: '保存成功!',showCancel: false,confirmText: '好的',confirmColor: '#333',success: function (res) {if (res.confirm) { }},fail: function (res) { }})},fail: function (res) {wx.showToast({title: res.errMsg,icon: 'none',duration: 2000})}})}});}, 1000);},})

友情链接  资源参考 :https://blog.csdn.net/qq_41629498/article/details/82052729

          https://www.jianshu.com/p/6204e9d9b277

          资源共享,一起学习,   一起进步  !  peace  & love

 

转载于:https://www.cnblogs.com/520BigBear/p/11075910.html

小程序生成海报 详解相关推荐

  1. python小游戏代码大全-20行python代码的入门级小游戏的详解

    背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...

  2. 微信小程序点击按钮弹出弹窗_转载 | 广东大学生就业创业微信小程序操作流程详解(一)...

    广东大学生就业创业微信小程序 操作流程详解(一) 转眼来到10月,炎炎夏日也阻挡不了青春的忙碌,同学萌走出校园,迈向社会. 在这段时间,同学们不仅要准备毕业论文,应对毕业答辩,还需要兼顾各种毕业手续的 ...

  3. 小甲鱼PE详解之资源(PE详解11)

    小甲鱼PE详解之资源(PE详解11) 我们知道,Windows 将程序的各种界面定义为资源,包括加速键(Accelerator).位图(Bitmap).光标(Cursor).对话框(Dialog Bo ...

  4. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  5. 微信小程序生成海报 poster

    原生小程序 canvas 小程序-canvas绘图并保存到系统相册 小程序导出朋友圈海报详细记录 逻辑清晰的说明了,原生小程序 canvas 绘制的步骤: 获取 Canvas.context 绘制背景 ...

  6. 微信小程序生成海报可保存海报和分享海报

    最近因为小程序生成海报分享的问题头疼了很久,所以自己总结了一下供大家参考,可以放置用户头像姓名以及商品名称价格和二维码太阳码等,实测可用! 下载链接https://download.csdn.net/ ...

  7. 微信小程序python flask_Python Flask 搭建微信小程序后台详解

    前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个 ...

  8. uniapp-微信小程序 分包--详解

    uniapp-微信小程序 分包–详解 实际环境(用business举例,可以创建很多个分包) 先说好,如果代码模块多,就一个一个模块搞(照着做不会错) 直入主题,我代码写完了,一真机运行,g,发现超过 ...

  9. 微信小程序版本管理详解

    本来觉得没必要写版本管理的文章. 奈何微信的官方文档真的是太不友好了!!! 一顿操作猛如虎.(请原谅我知识轻薄). 本文只是我这几天操作过的,一些个人理解总结,如果,有什么不对的,欢迎大家纠正我的错误 ...

最新文章

  1. oracle11g开启1158,1、Oracle11g中浏览器访问不了http://localhost:1158/em的问题
  2. Laravel Ioc容器singleton和bind方法的区别
  3. Go语言defer详解
  4. Matlab 函数:padarray
  5. 微信公众号自动回复 node
  6. wxWidgets:wxAuiToolBar类用法
  7. Spark Structure Streaming(一)之简介
  8. springboot mybatis 热加载mapper.xml文件(最简单)
  9. bcdboot修复win10引导并通过ubuntu live USB安装grub
  10. 樊登读书搞定读后感_《读懂一本书:樊登读书法》读后感
  11. 云计算数据中心运维管理的重点
  12. Compilation failure:错误: 找不到符号
  13. jQuery 表单提交衣服尺寸选择勾选获取value值-20130720
  14. 使用distpicker的简单测试页面
  15. 语音识别基础算法——动态时间规整算法
  16. 解决maven打jar包时不把依赖打包进去的问题
  17. #3. 复读机(LibreOJ)
  18. 各互联网大厂工程师薪资新鲜出炉,速来围观!
  19. 【重点突破】—— UniApp微信小程序开发教程学习Three
  20. 一键离线地图发布工具(教程)

热门文章

  1. Python中的集合
  2. java实现对无符号整数的支持
  3. 腾讯翻译君在线翻译怎么翻译整个文件_藏语怎么翻译成中文?这两方法非常好用...
  4. debian 8 mysql_在Debian 8系统安装 nginx + php + mysql(MariaDB) 基本Web环境
  5. 计算机网络的组成和结构ppt,常见的计算机网络拓扑结构PPT课件.pptx
  6. android onclick执行顺序,错误“无法执行android:onClick的方法”
  7. python3写冒泡排序_使用python3实现冒泡排序、选择排序和快速排序
  8. mysql privileges_[转]mysql privileges
  9. 群晖docker装huginn_应用篇:Docker版Zerotier实现内网穿透
  10. java http 接口制定_java調用http接口