微信小程序绘制分享图例子:

demo下载地址:https://gitee.com/v-Xie/wxCanvasShar

大致代码会再以下说明

实际开发项目:

基础知识点:

了解canvas基础知识

wx.createCanvasContext()//微信小程序创建画布

wx.canvasToTempFilePath()//将画布canvas转为图片

wx.saveImageToPhotosAlbum() //微信小程序保存至相册

canvas绘制以及绘制过程中的坑:(请看后面的代码部分)

1.绘制头像后之后绘制的内容不显示

2.头像地址换成网络地址后无法显示

3.实现多行文本换行并且获取绘制的文本的高度

<!--index.wxml-->
<view class="container">
<!-- 画布 -->
<!-- canvas -->
<canvas canvas-id="myCanvas" style="width:300px;height:320px;position:fixed;top:40px;"></canvas><!-- 要保存至相册的图片 --><view class='imagePathBox'><text>要分享的图片</text><image src="{{imagePath}}"></image>
</view><button bindlongpress='baocun'>长按保存分享</button>
</view>

//index.js
const app = getApp()Page({data: {imagePath:'',imgurl:'https://aecpm.alicdn.com/simba/img/TB1p4s3GVXXXXb6XVXXSutbFXXX.jpg'},onLoad: function() {// 调用画布// this.createNewImg();var self=this;wx.downloadFile({url: self.data.imgurl,success: function (res) {// 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容if (res.statusCode === 200) {console.log(res, "rrrr")self.setData({imgurl: res.tempFilePath})console.log('头像临时路径=====');console.log(self.data.imgurl);// self.createNewImg(); // 调用canvas绘制的结果图
        }}})setTimeout(function(){self.createNewImg(); },500);},/*绘制圆行头像clip()从原始画布中剪切任意形状和尺寸。坑点:1.绘制头像后之后绘制的内容不显示2.头像地址换成网络地址以后无效提示:一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)。解决方案:坑1:原因:clip()造成解决方案:可在使用 clip() 方法前通过使用 save() 方法对当前画布区域进行保存,并在以后的任意时间通过 restore() 方法对其进行恢复坑2:原因:1.未将网络地址转换为临时路径  2.未配置download选项的合法域名解决方案:wx.downloadFile()实现临时路径转换,并配置合法域名*/circleImg(ctx, img, x, y, r) {ctx.save();var d = 2 * r;var cx = x + r;var cy = y + r;ctx.arc(cx, cy, r, 0, 2 * Math.PI);ctx.clip();ctx.drawImage(img, x, y, d, d);ctx.restore();},/*如何实现多行文本分段语法: ctx.fillText('文本','文本的左上角x坐标位置','文本的左上角y坐标位置');startXpoint:文本左上角x坐标位置startYpoint:左上角y坐标位置textHeight:文本与顶部基线距离[文本高度]canvasWidth:画布大小fontSize:文本字体大小lineHeight:行高*/drawText(ctx, str, startXpoint, startYpoint, textHeight, canvasWidth, fontSize, lineHeight) {var textWidth = 0;var lastSubStrIndex = 0; //每次开始截取的字符串的索引for (let i = 0; i < str.length; i++) {textWidth += ctx.measureText(str[i]).width;if (textWidth > canvasWidth) {ctx.font = "normal 14px Arial";ctx.fillStyle = 'green';ctx.fillText(str.substring(lastSubStrIndex, i), startXpoint, startYpoint); //绘制截取部分startYpoint += fontSize; //16为字体的高度textWidth = 0;lastSubStrIndex = i;textHeight += lineHeight;}if (i == str.length - 1) { //绘制剩余部分ctx.fillText(str.substring(lastSubStrIndex, i + 1), startXpoint, startYpoint);}}// 绘制后文本的高度return textHeight},/*1.绘制画布2.将canvas转换为图片保存到本地,然后将图片路径传给image图片的src*/createNewImg: function () {var self = this;var ctx = wx.createCanvasContext('myCanvas');// 初始要画一个相当于画布大小的容器//设计稿分享图多大,画布就多大ctx.strokeStyle = "#ccc";ctx.strokeRect(0, 0, 300, 320);//绘制矩形//语法:填充型fillRect(x,y,w,h) 或 描边型strokeRect(x,y,w,h) x,y坐标起点     w:矩形宽度 h:矩形高度ctx.fillStyle = "#FF0000";ctx.fillRect(20, 20, 50, 40);ctx.strokeStyle = "blue";ctx.strokeRect(140, 20, 50, 40);//绘制线条    //语法:moveTo(x,y)线条起始坐标 (同样可以用来改变画笔的起始坐标点)      lineTo(x,y);线条结束坐标  ctx.moveTo(20, 80);ctx.lineTo(200, 100);ctx.textWidth = 10;//线条宽度ctx.lineCap = 'round'//lineCap 线段端点显示的样子 ,值为butt,round 和 square。默认是 buttctx.strokeStyle = "green";ctx.stroke();//绘制圆//语法:arc(x,y,r,start,stop)    x,y圆心中心点坐标   r:半径  start: 起始角度 stop:结束角度ctx.beginPath();//重新创建路径ctx.arc(40, 130, 30, 0, 2 * Math.PI);ctx.strokeStyle = "purple";ctx.textWidth = 4;//描边宽度ctx.fillStyle = "red";ctx.fill();ctx.stroke();//绘制文本//语法:fillText(text, x, y, [maxWidth]) strokeText(text, x, y, [maxWidth])ctx.font = "normal 18px Arial";ctx.textAlign = 'center';ctx.textBaseline = 'bottom';ctx.fillStyle = 'blue';ctx.fillText("绘制文本", 120, 140);ctx.strokeText("绘制文本", 120, 170);//没有设置新的strokeStyle或textWidth等时会自动继承上一个strokeStyle或textWidth等// ctx.textWidth = 1;//strokeStyle或textWidth// ctx.strokeStyle = "green";ctx.strokeText("绘制文本", 120, 200);var img='../../images/2.jpg';ctx.drawImage(img, 10, 170, 60, 70);ctx.fillStyle = 'red';this.circleImg(ctx,img,200,20,40);ctx.fillText("继续啊", 240, 140);ctx.drawImage(self.data.imgurl, 180, 150, 100, 80);var text ="把握大好时机,认真理性投资。用自己的才华和智慧积极进取。把握大好时机,认真理性投资。用自己的才华和智慧积极进取。";self.drawText(ctx, text, 160, 260, 0, 260, 14, 0);ctx.save(); // 保存当前ctx的状态 ctx.restore();
    ctx.draw();setTimeout(function () {wx.canvasToTempFilePath({x: 0,y: 0,width: 300,height: 320,destWidth: 300 * 2,//生成图片的大小设置成canvas大小的二倍解决模糊destHeight: 320 * 2,canvasId: 'myCanvas',success: function (res) {var tempFilePath = res.tempFilePath;self.setData({imagePath: tempFilePath});wx.hideToast();console.log('canvas图片地址:' + self.data.imagePath);}});}, 600);},//点击保存到相册baocun: function () {var self = this;wx.saveImageToPhotosAlbum({filePath: self.data.imagePath,success(res) {wx.showModal({content: '图片已保存到相册,赶紧晒一下吧~',showCancel: false,confirmText: '好的',confirmColor: '#333',success: function (res) {if (res.confirm) {console.log('用户点击确定');}}, fail: function (res) {console.log(res)}})}})},})

转载于:https://www.cnblogs.com/lingXie/p/10609530.html

微信小程序绘制分享图相关推荐

  1. 微信小程序——绘制折线图

    一.wxml <view class="canvas-view"><canvas class="canvas" canvas-id=" ...

  2. 微信小程序实现Echarts图的动态实时刷新

    在微信小程序绘制折线图时,选择Echarts.官网如下:https://echarts.apache.org/zh/index.html 效果如下:(由于为截取动态图,只有实时图片结果) 微信小程序中 ...

  3. 微信小程序之分享功能

    一.介绍 微信小程序的分享功能可以分享页面给朋友或群聊,但是不能分享到朋友圈,需要分享朋友圈的话,可以在小程序内设计一个分享页面,利用小程序提供的canvas把小程序码绘制到分享图里保存到本地分享到朋 ...

  4. 微信小程序绘制海报,或者把多张图片合成一张

    微信小程序绘制海报,或者把多张图片合成一张,例子 <image style='height:{{mabgh}}px;width:{{mabgw}}px;' class="savepng ...

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

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

  6. android分享朋友圈功能,微信小程序实现分享至朋友圈的功能来啦

    微信小程序「分享至朋友圈」能力,终于来了!(之前,我相信大部分微信小程序的开发者都是用"分享卡片"的形式,手动调用wx.createCanvasContext生成一张图片,让用户生 ...

  7. 微信小程序实现分享至朋友圈的功能

    微信小程序实现分享至朋友圈的功能 微信小程序从基础库 2.11.3 开始,可将小程序页面分享到朋友圈.适用于内容型页面的分享,不适用于有较多交互的页面分享. 1 设置分享状态 小程序页面默认不可被分享 ...

  8. 微信小程序商品分享海报

    canva实现微信小程序商品分享海报 前言 使用canvas画布实现小程序分享海报功能 一.定义一个生成海报按钮 1.点击按钮生成海报 catchtap:handleShare 使用catch绑定阻止 ...

  9. python天气查询小程序加背景图_微信小程序开发背景图显示功能

    这两天开发微信小程序,在设置背景图片时,发现在wxss里面设置background-image:(url) 属性,不管是开发工具还是线上都无法显示.经过查资料发现,background-image只能 ...

最新文章

  1. 《ArcGIS Runtime SDK for Android开发笔记》——(13)、图层扩展方式加载Google地图...
  2. 图挖掘与多关系学习:工具与应用,亚马逊与CMU-WWW2021教程(附ppt)
  3. UA MATH563 概率论的数学基础1 概率空间3 概率测度
  4. 设计模式--简单工厂VS工厂VS抽象工厂
  5. 计算机游戏比赛,计算机学院2013年趣味运动会游戏比赛细则.doc
  6. BCVP开发者社区2022专属周边第一弹
  7. 潜在语义分析原理以及python实现代码!!!!
  8. Re-attention机制Transformer,实现强大性能
  9. python打开外部应用
  10. 开源原生JavaScript插件-CJPCD(省市区联动)
  11. git 常见操作合集
  12. 大型项目用python吗_在大型项目上,Python 是个烂语言吗?
  13. useragent大全
  14. 机械制图国家标准的绘图模板_JS制图:映射
  15. 「Go工具箱」一个能下载各种视频的开源工具
  16. 硅钢片铁芯、坡莫合金、非晶及纳米晶软磁合金
  17. CQF笔记M1L2二叉树模型
  18. MR:二:什么是MR混合现实技术?
  19. mac mysql 1055_Mysql 错误“1055”
  20. 信息系统安全等级保护一些实施难点

热门文章

  1. mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题
  2. Python的皮肤的使用
  3. go-testify和robfig
  4. 【Shiro】6、Shiro实现限制密码错误次数从而限制用户登录
  5. influxdb查看数据库命令_02-命令行操作influx
  6. 关于Win10 无法登陆破解方法
  7. 基于C语言开发Linux平台的协议分析软件
  8. 绘图_origin在一个页面上绘制多个图像x1y1和x2y2
  9. python怎么加注释
  10. 研二(上学期)计划安排