uniapp canvas生成海报

效果

在这里插入图片描述

封装组件,父组件 ref 调用 downImgUrl()函数,其他根据自己需求改

<template><view><view class="bgpart"><canvas class="canvas-wrap" canvas-id="canvasID" type="2d"></canvas><view class="popPart"><view><view class="share-list"><view class="share-item flexaround flexalign" @click="shareToFriend(1)"><view class="iconImg flexalign flexaround"><image src="/static/sharePop/share1.png" mode=""></image></view><text class="font26" style="margin-top: 16rpx;">微信</text></view><view class="share-item flexaround flexalign" @click="shareToFriend(2)"><view class="iconImg flexalign flexaround"><image src="/static/sharePop/share2.png" mode=""></image></view><text class="font26" style="margin-top: 16rpx;">朋友圈</text></view><view class="share-item flexaround flexalign" @click="downCli"><view class="iconImg flexalign flexaround" style="width: 88rpx;height: 88rpx;"><u-icon name="download" size="30"></u-icon></view><text class="font26" style="margin-top: 16rpx;">下载</text></view></view></view><view class="share-header flexalign flexaround" style="background: #fff;" @click="$emit('close')">取消</view></view></view></view>
</template><script>import {indexsettingPoster} from "@/api/all.js"export default {name: "sharePoster",props: {},data() {return {logo: '/static/logo.png',bgimg: '',detail: {},imgUrl:'',//完成海报图qrCode:''};},created() {},methods: {// 下载downCli() {if( this.imgUrl &&  this.imgUrl != ''){{uni.saveImageToPhotosAlbum({filePath: this.imgUrl,success: function () {console.log('save success'); uni.showToast({icon:"none",title:'已下载'})}});}},async downImgUrl(e,url,type) {await indexsettingPoster({url:url}).then(res => {this.bgimg = res.data.posterThumb this.qrCode = res.data.qrCode})let canW = 320;let canH = 450;let ctx = uni.createCanvasContext('canvasID', this);// ctx.setFillStyle("transparent"); //设置canvas背景颜色// ctx.fillRect(0, 0, 346, 500) //设置canvas画布大小ctx.drawImage(this.bgimg, 0, 0, canW, canH) //背景ctx.drawImage(this.logo, 18, 20, 36, 36) //logo// ctx.drawImage(e.dynamicQRcode, 255, 370, 70, 70) //二维码ctx.drawImage(this.qrCode, 230, 370, 70, 70) //二维码//绘制圆形头像this.drawCircular(ctx, e.headPortrait, 26, 398, 40, 40) // 名字ctx.setFontSize(14)ctx.setFillStyle("#ffffff")ctx.fillText(e.nickName, 74, 424)// 绘制标题,多余文字自动换行ctx.setFontSize(26)ctx.setFillStyle("#2C3E68")ctx.textAlign = "center"let str = type ? e.teamName : e.dynamicTitle// 字符串总长度let _strLength = str.length > 24 ? 24 : str.length// 总结截取次数let _strNum = Math.ceil(_strLength / 8)// 每次开始截取字符串的索引let _strHeight = 0// 绘制的字体 x,y的初始位置let _strX = 345 / 2,_strY = 90let strIndex = 223// 开始截取for (let i = 0; i < _strNum; i++) {strIndex = _strY + i * 40ctx.fillText(str.substr(_strHeight + i * 9, 9), _strX, _strY + i * 34)}// 绘制内容ctx.setFontSize(13)ctx.setFillStyle("#4FB0FF")let cont = type ? e.teamContent : e.dynamicDescribe// 字符串总长度let _contLength = cont.length  > 120 ? 120 : cont.length// 总结截取次数let _contNum = Math.ceil(_contLength / 20)// 每次开始截取字符串的索引let _contHeight = 0// 绘制的字体 x,y的初始位置let _contX = 345 / 2,_contY = 180let contIndex = 223// 开始截取for (let i = 0; i < _contNum; i++) {contIndex = _contY + i * 20ctx.fillText(cont.substr(_contHeight + i * 20, 20), _contX, _contY + i * 22)}//详情图let img = type ? e.teamPics : e.dynamicPics //团队,动态img.split(',').forEach((el,index)=>{if(index == 0){ctx.drawImage( el , 50, 290, 70, 70) //二维码}else if(index == 1){ctx.drawImage( el , 130, 290, 70, 70) //二维码}else if(index == 2){ctx.drawImage( el , 210, 290, 70, 70) //二维码}})ctx.draw(false, () => {// 返回canvas图片信息uni.canvasToTempFilePath({canvasId: 'canvasID',success: (res) => {this.imgUrl = res.tempFilePath},fail: function(err) {console.log(err)}})})},// 绘制圆形头像drawCircular(ctx, url, x, y, width, height) {//画圆形头像var avatarurl_width = width;var avatarurl_heigth = height;var avatarurl_x = x;var avatarurl_y = y;ctx.save(); //先保存状态,已便于画完园再用ctx.beginPath(); //开始绘制ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);ctx.setFillStyle("#FFFFFF")ctx.fill() //保证图片无bug填充ctx.clip(); //剪切ctx.drawImage(url, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth); //推进去图片ctx.restore();},}}
</script><style scoped lang="scss">
.flexaround{display: flex;justify-content: space-around;
}
.flexalign{display: flex;align-items: center;
}
.font26{font-size: 26rpx;font-family: PingFang-SC-Medium;
}.canvas-wrap {margin: 20% 45rpx;width: calc(100% - 90rpx);height: 940rpx;// background-color: #fff;}.bgpart {width: 100vw;height: 100vh;background-color: rgba(0, 0, 0, 0.5);position: fixed;left: 0;top: 0;z-index: 99;.popPart {width: 100%;height: 360rpx;background-color: #f5f5f5;border-radius: 20rpx 20rpx 0 0;position: fixed;left: 0;bottom: 0;z-index: 99;}}.share-header {line-height: 80rpx;}.share-list {margin: 20rpx 0 60rpx 0;display: flex;/* flex-direction: row; */flex-wrap: wrap;.share-item {margin-top: 30rpx;min-width: 20%;flex-direction: column;.iconImg {background-color: #fff;border-radius: 50%;image {width: 88rpx;height: 88rpx;}}}}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp运行提示_jsp.java某行存在错误问题的解决

jsp运行提示XXX_jsp.java某行存在错误问题的解决 在编译运行jsp文件时&#xff0c;出现类似如下提示&#xff1a; 49行发生错误&#xff0c;要注意&#xff1a; 这里所指的49行并非jsp文件的第49行&#xff0c;而是编译后的jsp.java文件的第49行。 因此&#xff1a;解决问题…

saas考试系统和私有化考试系统的区别

SaaS考试系统和私有化考试系统&#xff0c;作为现代信息化教育的重要工具&#xff0c;各有其独特的优势和特点。本文将从多个维度对这两种系统进行深入剖析&#xff0c;以揭示它们之间的核心差异。 首先&#xff0c;从部署方式来看&#xff0c;SaaS考试系统是基于云服务的在线考…

STM32--IAP程序升级实验

1. STM32程序升级方法 1.1 ST-link / J-link下载 将编译生成的hex文件使用ST-Link/J-Link工具直接下载进 Flash 即可。Keil中点击下载也能一键下载。下载后的代码会存放在Flash的起始地址0x0800 0000处。 简单补充一句&#xff0c;bin文件和hex文件的区别&#xff1a; bin文…

论坛产品选型,需要关注哪些点?

论坛社区是一个经久不衰的行业&#xff0c;比如我们常见的宠物社区&#xff0c;校园社区&#xff0c;游戏社区、企业内部社区&#xff0c;品牌社区&#xff0c;本地同城、私域社区项目、付费社群、问答社区等等&#xff0c;可以说是覆盖了各行各业&#xff0c;那么如果我们要搭…

Python实现管线建模 - 3.同心变径管

往期回顾 Python实现管线建模 || 1.圆直管、方管https://blog.csdn.net/Xxy9426/article/details/138836778?spm1001.2014.3001.5501 对依赖库的补充 随着后续内容的深入&#xff0c;我发现单纯靠trimesh库已经无法完成后续的建模&#xff08;涉及到多个几何体拼接或者是创建…

全域外卖系统源码在哪搭建?哪家公司的系统源码最值得推荐

随着全域外卖的兴起&#xff0c;全域外卖系统源码搭建逐渐在众多全域外卖赛道的入局方式中脱颖而出。但是&#xff0c;就目前多个创业者社群就这一话题的讨论程度来看&#xff0c;绝大多数创业者对于全域外卖系统源码搭建模式的了解都仅仅停留在“是什么”层面&#xff0c;而对…

Conmi的正确答案——Vue默认加载方式设置为Yarn后怎么修改

Vue版本&#xff1a;3 1和2主要是搜索文件所在位置&#xff0c;Windows的这个文件一般在“C:\User{当前用户}”下&#xff0c;linux的非root情况下一般在“/home/{当前用户}”下。 1、打开“Everything”&#xff1b; 2、搜索“vuerc”&#xff1b; 3、打开“.vuerc”&#xf…

Boom3D软件下载-Boom3D音效增强工具下载附加详细安装步骤

Boom3D音效增强工具是一款便捷的为用户们进行音频处理和编辑的软件&#xff0c;支持用户们轻松的进行音频的使用&#xff0c;支持超多的音频格式让你可以轻松的进行使用&#xff0c;Boom3D音效增强工具拥有多种音频特效的功能&#xff0c;让你可以在Boom3D音效增强工具轻松的进…

Linux时间子系统5:timekeeper、timecountercyclecounter

1. 前言 前面我们介绍了用户态获取时间的接口clock_gettime&#xff0c;时钟的种类posix_clocks以及时钟源clocksource。那么我们思考这样一个问题&#xff0c;无论clock_gettime或者posix_clock定义的时间都是相对于某个起始点的时间&#xff0c;即相对于Linux Epoch的秒数&am…

pytorch安装----CPU版本

在安装之前&#xff0c;需要先配置GPU环境&#xff08;安装CUDA和CudaNN) 命令行输入nvidia-smi&#xff0c;查看驱动信息 安装相应的CUDA 和CUDANN 验证&#xff1a;输入nvcc --version 或者nvcc -V 进行检查 在anaconda里创建环境 conda create -n py39gpu python3.9激活环…

丰臣秀吉-读书笔记二

“啊&#xff01;平凡的一生&#xff0c;想来也够长了。不过也短。究竟长还是短&#xff1f;或许只有这一刹那是永恒的吧&#xff0c;死亡的一刹那。生命若是永恒&#xff0c;也就取决于那一刹那。” 如果我死了&#xff0c;我的愿望只有这个&#xff1a; “无论多么黑暗&#…

【STC8A8K64D4开发板】第3-1讲:温度传感器DS18B20

第3-1讲&#xff1a;温度传感器DS18B20 学习目的了解DS18B20数字温度传感器的基本原理及其数据格式。掌握STC8A8K64D4与DS18B20单总线通信的程序设计&#xff0c;通信步骤&#xff0c;数据校验等。 硬件电路设计 DS18B20简介 DS18B20主要特性 DS18B20是Dallas 半导体公司推出的…

KernelFuzzer部署、使用与原理分析

文章目录 前言1、概述1.1、整体架构1.2、工作流程1.2.1、环境配置流程1.2.2、计划任务执行流程1.2.3、Fuzz测试流程1.2.3.1、整体资源调度1.2.3.2、选取Fuzz测试目标1.2.3.3、生成Fuzz测试参数1.2.3.4、进行Fuzz测试 2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.1.1…

硫碳复合材料可用作固态电池正极材料 锂硫电池是重要下游

硫碳复合材料可用作固态电池正极材料 锂硫电池是重要下游 硫碳复合材料&#xff0c;是半固态电池、固态电池的正极材料&#xff0c;主要用于金属硫电池制造领域&#xff0c;在锂硫电池应用中研究热度最高。 锂硫电池&#xff0c;一种二次电池&#xff0c;以硫元素为正极&#x…

HarmonyOS 页面路由(Router)

1. HarmonyOS页面路由(Router) 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。本文将从页面跳转、页面返回和页面返回前增加一个询问…

VBA学习(9):按指定名单一键删除工作表

今天继续给大家聊VBA编程中工作表对象的常用操作&#xff0c;主要内容是如何批量删除工作表&#xff1b;也就是删除单个工作表、删除全部工作表和删除指定名单内的工作表。 1.删除单个工作表 删除工作表需要使用到工作表对象的delete方法&#xff0c;语法格式如下&#xff1a…

聚类分析 #数据挖掘 #Python

聚类分析&#xff08;Cluster Analysis&#xff09;是一种无监督机器学习方法&#xff0c;主要用于数据挖掘和数据分析中&#xff0c;它的目标是将一组对象或观测值根据它们之间的相似性或相关性自动分组&#xff0c;形成不同的簇或类别。聚类分析并不预先知道每个观测值的具体…

可燃气体报警器:户外工地安全预警先锋,定期检定保障安全无忧

在现代化的建设进程中&#xff0c;户外工地作为城市发展的重要推动力&#xff0c;其安全问题一直备受关注。 工地现场往往涉及多种易燃易爆气体&#xff0c;一旦发生泄漏&#xff0c;后果不堪设想。因此&#xff0c;如何有效预警并防范可燃气体泄露&#xff0c;成为户外工地安…

新手小白从Windows转Linux,或许manjaro更适合你!

网管小贾 / sysadm.cc 野生动物园里有一块并不怎么大的水塘&#xff0c;一群火烈鸟就生活在这里。 它们在水塘里悠闲地漫步&#xff0c;饿了就找些小鱼小虾&#xff0c;困了就伸个懒腰、打个盹。 就这样日复一日&#xff0c;过着百无聊赖的日子&#xff0c;直到有一天…… 这…

easyexcel和poi版本冲突报错深入解析v2

easyexcel报错解决 问题 项目由poi改用easyexcel&#xff0c;报错如下&#xff1a; java.lang.NoSuchMethodError: ‘org.apache.poi.ss.usermodel.CellType org.apache.poi.ss.usermodel.Cell.getCellType()’ 原因 easyexcel中的poi和项目原本的poi版本冲突问题。 由于之前做…