2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 小程序

小程序canvas实现(分享朋友圈生成图片)

时间:02-03来源:作者:点击数:42

业务场景:生成一个浮层图片

实现思路:

设置一个盒子,将canvas生成的图片和保存图片的按钮放里边,当有canvas生成图片的时候这个盒子显示,否则隐藏。

这里需要注意的是,canvas画图片的时候,如果是线上路径就先要使用wx.getImageInfo获取图片的临时路径,使用这个路径就可以在真机上显示了

前台代码:

  • <canvas canvas-id="myCanvas" class='canvas'/>
  • <!-- 预览分享图 这里就是上图展示的效果 -->
  • <!-- 刚开始是隐藏的 生成分享图之后显示, 用一个布尔变量来控制 这里的样式大家看图就写出来了 -->
  • <view hidden='{{hidden}}' class='preview' bindtap='cancel'>
  • <image src='{{prurl}}' mode='widthFix'></image>
  • <view>
  • <button type='primary' size='mini' bindtap='save'>保存分享</button>
  • </view>
  • </view>

css代码:先让canvas不在用户的视线内

给弹出层设置固定定位,和透明色,弹性盒子

  • .canvas{
  • width: 100%;
  • height: 100%;
  • position: fixed;
  • left: 0;
  • top: 999999rpx;
  • background-color: rgba(0,0,0,0.3)
  • }
  • .preview{
  • position:fixed;
  • top:0;
  • left:0;
  • width:100vw;
  • height:100vh;
  • background-color:rgba(0,0,0,0.8);
  • z-index: 2;
  • text-align: center;
  • display:flex;
  • flex-flow:column;
  • }
  • .preview image{
  • width: 80%;
  • height: 80%;
  • margin: 10%;
  • margin-bottom: 5%;
  • }
  • .preview button{
  • margin:0 20rpx;
  • border-radius:50px;
  • background-color:#ee2a65;
  • width:40%;
  • }

js代码:主要就是将canvas生成的图片保存为本地的路径

  • onShow: function () {
  • var userId = wx.getStorageSync('user_id');
  • var that = this;
  • if (userId) {
  • var qrcode = wx.getStorageSync('qrcode');
  • if (!qrcode) {
  • that.getQuear();
  • }
  • }
  • },
  • getQuear:function(){
  • var user_id = wx.getStorageSync('user_id');
  • wxb.Post('/api/automatic.manage/getQrcode', {
  • user_id: user_id
  • }, function (data) {
  • //获取网络图片本地路径
  • wx.getImageInfo({
  • src: data.path,//服务器返回的图片地址
  • success: function (res) {
  • //res.path是网络图片的本地地址
  • // 小程序码
  • wx.setStorageSync('qrcode', res.path);
  • },
  • });
  • });
  • },
  • // 生成朋友圈图片
  • share: function () {
  • var conpanyCover = this.data.companyCover;
  • var companyName = this.data.companyName;
  • var companyPhone = this.data.companyPhone;
  • var companyBusiness = this.data.companyBusiness;
  • var companyAddress = this.data.companyAddress;
  • var companyIntroduce = this.data.companyIntroduce;
  • var user_id = wx.getStorageSync('user_id');
  • var that = this;
  • wx.getSystemInfo({
  • success: function (res) {
  • console.log(res.windowHeight)
  • console.log(res.windowWidth)
  • that.setData({
  • windowHeight: res.windowHeight,
  • windowWidth: res.windowWidth
  • })
  • },
  • })
  • var windowWidth = that.data.windowWidth;
  • const ctx = wx.createCanvasContext('myCanvas')
  • // 设置矩形边框
  • ctx.setStrokeStyle('#fff')
  • // 设置矩形宽高
  • ctx.strokeRect(0, 0, 400, 200)
  • let canvas = '../../resource/canvas.png';
  • ctx.drawImage(canvas, 0, 0, 400, 1000)
  • // 设置文字大小
  • ctx.setFontSize(12)
  • // 设置文字颜色
  • ctx.fillStyle = '#9d9d9d';
  • var str = "长按识别二维码,查看我小程序官网";
  • ctx.fillText(str, (windowWidth - ctx.measureText(str).width) / 2, 510)
  • var cover = '../../resource/4.png';
  • ctx.drawImage(cover, 0, 0, 400, 200);
  • // 名字设置
  • var name = wx.getStorageSync('companyContacts');
  • // 设置文字大小
  • ctx.setFontSize(26)
  • ctx.fillStyle = '#000';
  • var name = name;
  • // 填充文字
  • ctx.fillText(name, 150, 65)
  • // ctx.font = '微软雅黑';
  • // 设置文字大小
  • ctx.setFontSize(14)
  • ctx.fillStyle = '#454545';
  • // let canpany = ' 蚂蚁未来';
  • let canpany = companyName;
  • // 填充文字
  • ctx.fillText('公司名:' + canpany, 45, 100)
  • // 设置文字大小
  • ctx.setFontSize(14)
  • ctx.fillStyle = '#454545';
  • var position = ' 经理';
  • // 填充文字
  • ctx.fillText('职位:' + position, 45, 130)
  • // 联系方式
  • ctx.setFontSize(14)
  • ctx.fillStyle = '#454545';
  • // var tel = " 15289310354";
  • var tel = companyPhone;
  • // 填充文字
  • ctx.fillText('联系方式:' + tel, 45, 160)
  • // 公司地址
  • ctx.setFontSize(14)
  • ctx.fillStyle = '#000';
  • // 填充文字
  • ctx.fillText('公司地址', 60, 370)
  • // 公司业务标题
  • ctx.setFontSize(14)
  • ctx.fillStyle = '#000';
  • // 填充文字
  • ctx.fillText('公司业务', 60, 230)
  • // 公司业务
  • ctx.setFontSize(12)
  • ctx.fillStyle = '#666';
  • var text = companyBusiness;
  • var chr = text.split("");//这个方法是将一个字符串分割成字符串数组
  • var temp = "";
  • var row = [];
  • for (var a = 0; a < chr.length; a++) {
  • if (ctx.measureText(temp).width < windowWidth - 100) {
  • temp += chr[a];
  • }
  • else {
  • a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比
  • row.push(temp);
  • temp = "";
  • }
  • }
  • row.push(temp);
  • //如果数组长度大于2 则截取前两个
  • if (row.length > 2) {
  • var rowCut = row.slice(0, 2);
  • // 这个参数就可以判断显示几行
  • var rowPart = rowCut[1];
  • var test = "";
  • var empty = [];
  • for (var a = 0; a < rowPart.length; a++) {
  • if (ctx.measureText(test).width < windowWidth) {
  • test += rowPart[a];
  • }
  • else {
  • break;
  • }
  • }
  • empty.push(test);
  • var group = empty[0]//这里只显示两行,超出的用...表示
  • rowCut.splice(1, 1, group);
  • row = rowCut;
  • }
  • for (var b = 0; b < row.length; b++) {
  • ctx.fillText(row[b], 40, 253 + b * 18);
  • }
  • // 画线
  • ctx.setFillStyle('#efefef')
  • ctx.fillRect(45, 236, windowWidth - 100, 1)
  • // 业务图标
  • var yw = '../../resource/yw.png';
  • ctx.drawImage(yw, 40, 216, 16, 16)
  • // 公司简介
  • ctx.setFontSize(14)
  • ctx.fillStyle = '#000';
  • // 填充文字
  • ctx.fillText('公司简介', 60, 300)
  • // 画下线
  • ctx.setFillStyle('#efefef')
  • ctx.fillRect(45, 306, windowWidth - 100, 1)
  • // 简介图标
  • var yw = '../../resource/jj.png';
  • ctx.drawImage(yw, 40, 286, 16, 16)
  • // 公司简介
  • ctx.setFontSize(12)
  • ctx.fillStyle = '#666';
  • // var introduction = "蚂蚁未来科技有限公司办公室地址位于中国的首都,政治、文化中心北京,北京市朝阳区西大望路15号4号楼,注册资本为50 万元";
  • var introduction = wx.getStorageSync('companyIntroduce');
  • var chr = introduction.split("");//这个方法是将一个字符串分割成字符串数组
  • var temp = "";
  • var row = [];
  • for (var a = 0; a < chr.length; a++) {
  • if (ctx.measureText(temp).width < windowWidth - 100) {
  • temp += chr[a];
  • }
  • else {
  • a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比
  • row.push(temp);
  • temp = "";
  • }
  • }
  • row.push(temp);
  • //如果数组长度大于2 则截取前两个
  • if (row.length > 2) {
  • var rowCut = row.slice(0, 2);
  • var rowPart = rowCut[1];
  • var test = "";
  • var empty = [];
  • for (var a = 0; a < rowPart.length; a++) {
  • if (ctx.measureText(test).width < 220) {
  • test += rowPart[a];
  • }
  • else {
  • break;
  • }
  • }
  • empty.push(test);
  • var group = empty[0]//这里只显示两行,超出的用...表示
  • rowCut.splice(1, 1, group);
  • row = rowCut;
  • }
  • for (var b = 0; b < row.length; b++) {
  • ctx.fillText(row[b], 40, 322 + b * 18);
  • }
  • // 公司地址详情
  • var chr = companyAddress.split("");//这个方法是将一个字符串分割成字符串数组
  • var temp = "";
  • var row = [];
  • for (var a = 0; a < chr.length; a++) {
  • if (ctx.measureText(temp).width < windowWidth - 100) {
  • temp += chr[a];
  • }
  • else {
  • a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比
  • row.push(temp);
  • temp = "";
  • }
  • }
  • row.push(temp);
  • //如果数组长度大于2 则截取前两个
  • if (row.length > 1) {
  • var rowCut = row.slice(0, 1);
  • var rowPart = rowCut[0];
  • var test = "";
  • var empty = [];
  • for (var a = 0; a < rowPart.length; a++) {
  • if (ctx.measureText(test).width < 220) {
  • test += rowPart[a];
  • }
  • else {
  • break;
  • }
  • }
  • empty.push(test);
  • var group = empty[0]//这里只显示两行,超出的用...表示
  • rowCut.splice(1, 1, group);
  • row = rowCut;
  • }
  • for (var b = 0; b < row.length; b++) {
  • ctx.fillText(row[b], 40, 390);
  • }
  • // 画下线
  • ctx.setFillStyle('#efefef')
  • ctx.fillRect(45, 375, windowWidth - 100, 1)
  • // 地址图标
  • var yw = '../../resource/dz.png';
  • ctx.drawImage(yw, 40, 356, 16, 16)
  • // 小程序二维码
  • // var path1 = data.path;
  • var qrcode = wx.getStorageSync('qrcode');
  • console.log(qrcode)
  • ctx.drawImage(qrcode, (windowWidth - 80) / 2, 410, 80, 80)
  • ctx.draw(false, function () {
  • wx.canvasToTempFilePath({
  • canvasId: 'myCanvas',
  • success: function (res) {
  • console.log(res.tempFilePath)
  • // wx.previewImage({
  • // urls: [res.tempFilePath] // 需要预览的图片http链接列表
  • // })
  • that.setData({
  • prurl: res.tempFilePath,
  • hidden: false
  • })
  • }
  • })
  • });
  • },

点击保存图片

  • // 保存图片到本地
  • save:function(){
  • var that = this
  • wx.saveImageToPhotosAlbum({
  • filePath: that.data.prurl,
  • success(res) {
  • wx.showModal({
  • content: '图片已保存到相册,赶紧晒一下吧~',
  • showCancel: false,
  • confirmText: '好的',
  • confirmColor: '#333',
  • success: function (res) {
  • if (res.confirm) {
  • console.log('用户点击确定');
  • /* 该隐藏的隐藏 */
  • that.setData({
  • hidden: true
  • })
  • }
  • }
  • })
  • }
  • })
  • },
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
上一篇:很抱歉没有了 下一篇:微信小程序:蓝牙BLE连接10003问题分析及解决
推荐内容
相关内容
栏目更新
栏目热门