当前位置: 首页 > news >正文

uniapp纯前端绘制商品分享图

效果如图
在这里插入图片描述

// useMpCustomShareImage.ts

interface MpCustomShareImageData {canvasId: stringprice: stringlinePrice: stringgoodsSpecFirmName: stringimage: string
}const CANVAS_WIDTH = 500
const CANVAS_HEIGHT = 400
const BG_IMAGE = 'https://public-scjuchuang.oss-cn-chengdu.aliyuncs.com/goods_share.png'
const DEFAULT_IMAGE ='https://public-scjuchuang.oss-cn-chengdu.aliyuncs.com/mini_program/mp_default_sc.png'const loadImageInfo = (src: string): Promise<UniApp.GetImageInfoSuccessData> => {return new Promise((resolve, reject) => {uni.getImageInfo({src,success: resolve,fail: reject,})})
}// 绘制价格
const loadPrice = (ctx: any, text: string, x: number, y: number) => {ctx.font = `bold ${text.length >= 10 ? '32px' : '36px'} sans-serif`ctx.setFillStyle('#e2231a')ctx.setTextAlign('center')ctx.setTextBaseline('middle')ctx.fillText(text, x, y)
}// 绘制划线价
const loadLinePrice = (ctx: any, text: string, x: number, y: number) => {ctx.font = '20px sans-serif'ctx.setFillStyle('#999999')ctx.fillText(text, x, y)const metrics = ctx.measureText(text)ctx.strokeStyle = '#999999'ctx.lineWidth = 2const textWidth = metrics.widthctx.beginPath()ctx.moveTo(x - textWidth / 2, y)ctx.lineTo(x + textWidth / 2, y)ctx.stroke()
}// 绘制规格厂家
const loadGoodsSpecFirmName = (ctx: any, text: string, y: number) => {const maxWidth = 480ctx.font = '20px sans-serif'ctx.setFillStyle('#333')// 短文字const textWidth = ctx.measureText(text).widthif (textWidth <= maxWidth) {return ctx.fillText(text, CANVAS_WIDTH / 2, y)}// 长文字,省略显示const displayText = text.substring(0, 21) + '...'ctx.fillText(displayText, CANVAS_WIDTH / 2, y)
}const useMpCustomShareImage = () => {const set = async (data: MpCustomShareImageData): Promise<string> => {const { canvasId, price, linePrice, goodsSpecFirmName, image = DEFAULT_IMAGE } = dataconst imageWidth = 250const imageHeight = 250try {const ctx = uni.createCanvasContext(canvasId, this)const [bgImageInfo, imageInfo] = await Promise.all([loadImageInfo(BG_IMAGE),loadImageInfo(image),])// 绘制背景图ctx.drawImage(bgImageInfo.path, 0, 0, CANVAS_WIDTH, CANVAS_HEIGHT)// 绘制商品图ctx.drawImage(imageInfo.path, 20, 80, imageWidth, imageHeight)// 绘制价格loadPrice(ctx, price, CANVAS_WIDTH - imageWidth / 2, 150)// 绘制划线价loadLinePrice(ctx, linePrice, CANVAS_WIDTH - imageWidth / 2, 200)// 绘制规格厂家loadGoodsSpecFirmName(ctx, goodsSpecFirmName, 360)// 绘制await new Promise<void>((resolve) => {ctx.draw(false, resolve)})// 生成分享图const { tempFilePath } = await new Promise<UniApp.CanvasToTempFilePathRes>((resolve, reject) => {uni.canvasToTempFilePath({canvasId,success: resolve,fail: reject,})},)return tempFilePath} catch (error) {console.error('生成分享图失败:', error)return image}}return { set }
}export default useMpCustomShareImage

// 调用

import useMpCustomShareImage from './useMpCustomShareImage'const mpCustomShareImage = useMpCustomShareImage()mpCustomShareImage.set({canvasId: 'shareCanvas',price: `¥4.60/盒`,linePrice: `¥4.73/盒`,goodsSpecFirmName: `0.25g*50粒 重庆科瑞制药(集团)有限公司`,image:'https://public-scjuchuang.oss-cn-chengdu.aliyuncs.com/mini_program/mp_default_sc.png',}).then((img) => {// 分享图console.log(img)})// -left-[1000px] -top-[1000px] 要放在页面上,且不显示
<canvascanvasId="shareCanvas"class="w-[500px] h-[400px] absolute -left-[1000px] -top-[1000px]"
/>
http://www.lryc.cn/news/621522.html

相关文章:

  • MySQL 主键详解:作用与使用方法
  • Uniapp之微信小程序自定义底部导航栏形态
  • mac 通过homebrew 安装和使用nvm
  • 【uni-app】根据角色/身份切换显示不同的 自定义 tabbar
  • 晶振电路的负载电容、电阻参数设计
  • Vue3 Element-plus 封装Select下拉复选框选择器
  • 一文打通 AI 知识脉络:大语言模型等关键内容详解
  • Docker容器定时任务时区Bug导致业务异常的环境变量配置解决方案
  • Vue3 + Element Plus 实现可搜索、可折叠、可拖拽的部门树组件
  • 【Redis】Redis典型应用——缓存
  • Redis 官方提供免费的 30 MB 云数据库
  • AI客户维护高效解决方案
  • [Chat-LangChain] 前端用户界面 | 核心交互组件 | 会话流管理
  • 制造装配、仓储搬运、快递装卸皆适配!MinkTec 弯曲形变传感器助力,让人体工学改变劳动生活
  • 测试工程师应当具备的能力
  • 专题三_二分_在排序数组中查找元素的第一个和最后一个位置
  • 手机分身空间:空间自由切换,一机体验双重生活!
  • FCC认证三星XR头显加速全球量产,微美全息AI+AR技术引领智能眼镜硬件创新
  • FreeRTOS多核支持
  • PaddleNLP进行Bart文本摘要训练
  • JavaScript 流程控制语句详解
  • 稳定且高效:GSPO如何革新大型语言模型的强化学习训练?
  • SpringCloud -- Nacos详细介绍
  • 跨网络 SSH 访问:借助 cpolar 内网穿透服务实现手机远程管理 Linux
  • 搭建前端开发环境 安装nvm nodejs pnpm 配置环境变量
  • Spark03-RDD01-简介+常用的Transformation算子
  • SQL:生成日期序列(填补缺失的日期)
  • 完整技术栈分享:基于Hadoop+Spark的在线教育投融资大数据可视化分析系统
  • 【Docker】关于hub.docker.com,无法打开,国内使用dockers.xuanyuan.me搜索容器镜像、查看容器镜像的使用文档
  • 关于截屏时实现游戏暂停以及本地和上线不同步问题