微信小程序商品分享海报

article/2025/10/5 22:17:27

canva实现微信小程序商品分享海报


前言

使用canvas画布实现小程序分享海报功能


一、定义一个生成海报按钮

1.点击按钮生成海报
catchtap:handleShare 使用catch绑定阻止事件冒泡

<view class="poster_window "  catchtap="handleShare"><view class="poster_warp"><image src="/icons/posticon.png" mode="widthFix" lazy-load="true"></image><view class="post_text">生成海报</view></view>
</view>

二、定义一个生成海报的方法

1.调用wx.createSelectorQuery()获取页面节点信息以及使用canvas.getContext创建画布

代码如下(示例):

/* 生成海报方法 */
data:{startDateTime:'', //开团时间endDateTime:'',//截团时间dateTime:'',//当前时间showShare:true,//显示分享海报newsImg:'',// 海报商品图postimg:'',goodsUrl:'',newText:'',canvas:'',ctx:'',dpr:'',Img:'',codeImg:''},onLoad: function () {this.creatImage()},
creatImage(){const query = wx.createSelectorQuery()query.select('#myCanvas').fields({ node: true, size: true }).exec((res) => {const canvas = res[0].nodeconst ctx = canvas.getContext('2d')const dpr = wx.getSystemInfoSync().pixelRatiocanvas.width = res[0].width * dprcanvas.height = res[0].height * dprctx.scale(dpr, dpr)ctx.fillStyle = '#ffffff'//背景颜色ctx.fillRect(0, 0, 300, 485)this.setData({canvas,ctx,dpr})this.drawHeader()this.goodsImg()this.price()this.goodsname()this.codeImg()})},

2.海报顶部图片

代码如下(示例):

/* 顶部图片 */drawHeader(){let {canvas,ctx} = this.data const headImg = canvas.createImage()headImg.src = '/images/pbg.png'headImg.onload = () =>{ctx.drawImage(headImg, 0, 0, 300, 50)}},

3.海报商品图片

代码如下(示例):

/* 商品图片 */
goodsImg(){let {canvas,ctx,endDateTime} = this.datalet oldTime = new Date(endDateTime)var month = (oldTime.getMonth()+1)<10?'0'+(oldTime.getMonth()+1):(oldTime.getMonth()+1)var date = (oldTime.getDate())<10?'0'+(oldTime.getDate()):(oldTime.getDate())var hours = (oldTime.getHours())<10?'0'+(oldTime.getHours()):(oldTime.getHours())var minutes = (oldTime.getMinutes())<10?'0'+(oldTime.getMinutes()):(oldTime.getMinutes())var DateTime = month+ '月'+date+ '日' + ' '+hours+':'+minutesconst goodsImg = canvas.createImage()goodsImg.src = this.data.goodsUrlgoodsImg.onload = () =>{ctx.drawImage(goodsImg,10,60,280,280)var grd=ctx.createLinearGradient(0,0,170,0);grd.addColorStop(0,"#F53C28");grd.addColorStop(1,"#79235E");ctx.fillStyle = grd;ctx.fillRect(10,310,220,30);ctx.fillStyle = '#ffffff';ctx.font="14px Arial";ctx.fillText("限时抢购",15,330);ctx.fillStyle = '#ffffff';ctx.font="14px Arial";ctx.fillText(DateTime+"截团",90,330);ctx.beginPath()ctx.moveTo(80,320);ctx.lineTo(80,332);ctx.lineWidth=1.5;ctx.strokeStyle="#ffffff";ctx.stroke()}},

4.商品价格

代码如下(示例):

/* 价格 */price(){let {ctx} = this.datactx.fillStyle = "#F53C28"; ctx.font="18px Arial";ctx.fillText("¥",10,375);ctx.font="22px Arial";ctx.fillText(this.data.minPrice(商品价格)+' 起',30,375);},

5.商品名称

代码如下(示例):

goodsname(){let {ctx,newText} = this.datalet chr = newText.split("");let temp = "";let row = [];ctx.font="16px Arial";ctx.fillStyle = "#000000";for (var a = 0; a < chr.length; a++) {if (ctx.measureText(temp).width < 155) {temp += chr[a];}else {a--; //这里添加了a-- 是为了防止字符丢失,效果图中有对比row.push(temp);temp = "";}}row.push(temp); if (row.length > 3) {var rowCut = row.slice(0, 3);var rowPart = rowCut[2];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(2, 1, group);row = rowCut;}for (var b = 0; b < row.length; b++) {ctx.fillText(row[b], 10, 405 + b * 25, 300);}},

6.小程序二维码

代码如下(示例):

 codeImg(){let {canvas,ctx} = this.dataconst codeImg = canvas.createImage()codeImg.src = this.data.codeImg//小程序二维码图片codeImg.onload = () =>{ctx.save()ctx.drawImage(codeImg, 200, 355, 85,85)ctx.restore()ctx.fillStyle = '#000000';ctx.font="12px Arial";ctx.fillText("长按扫码下单",207,460);}},

7.点击生成海报

代码如下(示例):

/* 显示海报 */async handleShare(e){await showToast({title:'海报生成中...',icon:'loading'})setTimeout(() => {this.createImg()this.setData({showShare:false})}, 2000);},/* 生成图片 */createImg(){wx.canvasToTempFilePath({canvas: this.data.canvas,width: 300,height: 485,success:res=> {this.setData({postimg:res.tempFilePath})}})},

在这里插入图片描述


总结

这只是一个制作生成分享海报的一个方法,具体海报的布局根据需求完成!


http://chatgpt.dhexx.cn/article/nvip7IPu.shtml

相关文章

小白开发微信小程序18--转发API

1、什么是api 微信小程序API&#xff08;Application Programming Interface&#xff09;&#xff0c;应用程序编程接口&#xff0c;也是程序员口中常说的接口。其实api并不专属于小程序&#xff0c;任何编程语言或程序形态都有相对应的api。而我们今天谈的小程序api&#xff0…

mysql在线增加字段_MySQL在线加字段实现原理

作者&#xff1a;vinchen 腾讯互娱内部维护了一个TMySQL分支&#xff0c;基于官方5.5.24&#xff0c;实现了类似于Oracle 11g的快速加字段功能。该功能通过扩展存储格式来实现&#xff0c;原理类似于Oracle 11g&#xff0c;以下介绍下其实现原理。 1. GCS行格式 需要在innodb中…

mysql新增json_mysql5.7 新增的json字段类型用法实例分析

本文实例讲述了mysql5.7 新增的json字段类型用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 一、我们先创建一个表&#xff0c;准备点数据 CREATE TABLE json_test ( id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ID, json json DEFAULT NULL COMMENT j…

Mysql新增字段到大数据表导致锁表

昨天晚上7点左右&#xff0c;对一张表进行加字段&#xff0c;大概200多万条记录&#xff0c;字段90多个的大表&#xff0c;结果造成mysql锁表&#xff0c;进而导致服务不可用。执行语句如下&#xff1a; [sql] view plain copy ALTER TABLE sc_stockout_order ADD route_remar…

MySQL 新增字段(alter table add column),报错:Duplicate entry

问题 执行一个增加字段的DDL语句脚本时&#xff0c;报错&#xff0c;错误如下: Error 1062: Duplicate entry c51d3db8-59a5 2022-06-28 17:59:59 for key uniq_material_date重复执行报相同的错误。根据错误提示的条件去数据库中查询却只能查到一条记录&#xff0c;并没有重…

mysql新增、修改表字段

一、新增字段 说明&#xff1a;以下语句关键字COLUMN&#xff0c;都可以省略&#xff0c;“ACT_AAA”是表名 格式 ALTER TABLE 表名 ADD COLUMN 字段名称 字段类型&#xff08;字段长短-选填&#xff09; CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL&#xf…

ln命令使用

Linux中ln是一个非常重要的一个命令&#xff0c;主要是将两个文档进行连接&#xff0c;创建一个连接关系 连接档&#xff1a;ln 使用ln可以在两个文件之间建立关联&#xff0c;就类似Windows下的快捷方式&#xff0c;连接有两种方式 Hard Link&#xff08;硬式连接或实际连接…

Linux ln 命令是什么?C/C++代码实现

在Linux中&#xff0c;在命令行上工作时&#xff0c;需要在文件之间创建链接&#xff0c;将文件名与文件数据相关联。这可以使用名为 ln 的专用命令来实现。 什么是链接&#xff1f; 在讨论 ln 命令之前&#xff0c;让我们先讨论一下链接命令&#xff0c;什么是链接&#xff…

Linux命令详解(13)- ln命令

ln是英文“link files”的缩写&#xff0c;命令不算复杂&#xff0c;但是非常重要。 语法&#xff1a; ln option Source file or directory Destination file or directory 这里先讲下两个概念。 1.软连接 软链接类似于windows系统中的快捷方式。创建之后&#xff0c…

linux ln 远程,Linux 软连接 (ln命令)

这是linux中一个非常重要命令。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个…

linux 中的 ln 命令,Linux ln命令操作指南

ln是Linux系统中一个重要的命令&#xff0c;能够为文件建立链接&#xff0c;保持链接文件的同步性&#xff0c;下面小编就给大家介绍下Linux下如何使用ln命令&#xff0c;通过实例来详细了解。 1. 使用ln命令给档案创建symbolic link。 linux系统下的symbolic link类似于window…

Linux ln命令详解

ln命令来自于英文单词link的缩写&#xff0c;中文译为“链接”&#xff0c;其功能是用于为某个文件在另外一个位置建立同步的链接。Linux系统中的链接文件有两种形式&#xff0c;一种是硬链接&#xff08;hard link&#xff09;&#xff0c;另一种是软链接&#xff08;symbolic…

ln命令应用

记录&#xff1a;352 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用ln命令创建软链接(symbolic links)和硬链接(hard links)。解决&#xff1a;Too many levels of symbolic links。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 1.命令应用 (1)目录创建软…

linux ln命令

ln 命令的功能是在不同的位置创建一个链接&#xff0c;又分软链接和硬链接&#xff0c;一般软链接使用较多。 硬链接&#xff1a;ln 源文件 链接文件 是在选定的位置生成一个文件的镜像&#xff0c;镜像文件与源文件同样大小 软连接&#xff1a;ln –s 源文件 链接文件 是…

ln命令详解

Linux文件系统中&#xff0c;有所谓的链接(link)&#xff0c;我们可以将其视为档案的别名&#xff0c;而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link)&#xff0c;硬链接的意思是一个文件可以有多个名称&#xff0c;而软链接的方式则是产生一个特殊的文件&…

ubuntu18.04虚拟机崩掉导致硬盘错误,提示fsck manually

问题描述&#xff1a; 可能是一次性复制的文件太大了&#xff0c;导致内存吃紧&#xff0c;Windows10直接崩掉&#xff0c;接着就进入了我经常看到的那个蓝屏错误提示界面&#xff0c;有个正在恢复的百分数进度提示。 这个问题我经常碰到&#xff0c;或许是网页开多了吧&…

dos磁盘管理命令

dos磁盘管理命令 前言 磁盘管理命令用于日常的磁盘维护。DOS命令行提供了多种文件管理命令用于设置和管理磁盘列表。由于很多磁盘在没有安装图形界面的时候就需要对其进行操作&#xff0c;所以掌握DOS命令行下的磁盘管 理命令对系统管理员是十分必要的。 磁盘管理命令 以下…

centos 硬盘 修复

xfs_repair -n /dev/sdb centos 硬盘 修复 sudo parted -l sudo parted -l [localhost home]$ sudo parted -l Model: Dell VIRTUAL DISK (scsi) Disk /dev/sda: 1000GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags:Number Start End…

电脑修复损坏文件--修复命令;系统盘磁盘空间不足

目录 sfc/scannow--修复损坏的系统文件命令解析command parse步骤 命令修复磁盘&#xff1b;磁盘空间的释放输入“sfc /purgecache”命令&#xff08;不含双引号&#xff0c;下同&#xff09;输入“cleanmgr”命令输入“CHKDSK D:/F”&#xff0c;修复D驱动器号 sfc/scannow–修…

mac 磁盘修复

1、使用磁盘工具 2、终端查看并修复 diskutil listdiskutil verifyVolume disknamediskutil repairDisk diskname