【uniapp小程序-生成二维码+多个图片文字合并一张图】

html 复制代码
<!-- 二维码 -->
		<canvas id="qrcode" canvas-id="qrcode" width="120" ></canvas>

		<!-- 生成带小程序码的分享图片 -->
		<canvas canvas-id="shareCanvas" class="share-canvas"></canvas>
css 复制代码
#qrcode{
	opacity: 0;
	position: absolute;
	left: -800rpx;
}
.share-canvas {
	width: 720px;
	height: 1280px;
	background: #fff;
	position: fixed;
	left: -720px;
	top: 0;
}

下载uqrcodejs:https://uqrcode.cn/doc/guide/getting-started.html

js 复制代码
import UQRCode from 'uqrcodejs'; 
export default{
	data(){
		return{
			val: 'https', // 要生成的二维码的地址
			src: '', // 二维码生成后的图片地址或base64
			bgUrl:'https',//背景图片
		}
	},
	methods:{
			andImg() {
				//分享生成图片
				uni.showLoading({
					title: "正在生成图片"
				})
				if(this.activity_id==11){
				// 获取uQRCode实例
				var qr = new UQRCode();
				// 设置二维码内容
				qr.data = this.val
				// 设置二维码大小,必须与canvas设置的宽高一致
				qr.size = 120;
				// 调用制作二维码方法
				qr.make();
				// 获取canvas上下文
				var canvasContext = uni.createCanvasContext('qrcode', this); // 如果是组件,this必须传入
				// 设置uQRCode实例的canvas上下文
				qr.canvasContext = canvasContext;
				// 调用绘制方法将二维码图案绘制到canvas上
				qr.drawCanvas();
				this.$nextTick(()=>{
					uni.canvasToTempFilePath(
					    {
					        canvasId: 'qrcode',
					        width: 120,
					        height: 120,
					        success: res => {
								if(res.errMsg=='canvasToTempFilePath:ok'){
									this.src = res.tempFilePath//获取生成的二维码地址
									this.onImg()
								}
					        },
					        fail: err => {
					            console.log(err);
					        }
					    }, 
					);
				})
			},
			
			onImg() {
				function toFormateStr (ctx, str, draw_width, lineNum, startX, startY, steps ) {
				
					var strWidth = ctx.measureText(str).width;     // 测量文本源尺寸信息(宽度)
					var startpoint = startY, keyStr = '', sreLN = strWidth / draw_width;
					var liner = Math.ceil(sreLN);     // 计算文本源一共能生成多少行
					let strlen = parseInt(str.length / sreLN); 	// 等比缩放测量一行文本显示多少个字符
								
					// 若文本不足一行,则直接绘制,反之大于传入的最多行数(lineNum)以省略号(...)代替
					if (strWidth  < draw_width) {
					
						ctx.fillText(str, startX, startpoint);
						
					} else {
					
						for (var i = 1; i < liner + 1; i++) {
							let startPoint = strlen * (i-1);
							if (i < lineNum || lineNum == -1) {
								keyStr = str.substr(startPoint, strlen);
								ctx.fillText(keyStr, startX, startpoint);
							} else {
								keyStr = str.substr(startPoint, strlen-5) + '...';
								ctx.fillText(keyStr, startX, startpoint);
								break;
							}
							startpoint = startpoint + steps;
						}
						
					}
				}
				const that = this
				//绘制图片
				that.csimg = true
				that.iconlogo = true
				//创建canvas
				let shareCanvas = uni.createCanvasContext('shareCanvas')
				//绘制背景图片
					//canvas绘制图片(drawImage)无效,显示不了,
					//uniapp的drawImage绘制图片和微信小程序一样,图片路径不能使用网络路径,必须先下载到本地(使用uni.downloadFile()下载成临时文件路径也行)
				uni.downloadFile({
					url:that.bgUrl,
					success(res){
						shareCanvas.drawImage(res.tempFilePath, 0, 120, 720, 1280)
						if(that.companyInfo.company_abbr){
							if(that.companyInfo.company_abbr.length <= 6){
								shareCanvas.setFontSize('56')
							}else if(that.companyInfo.company_abbr.length > 6 && that.companyInfo.company_abbr.length <= 10){
								shareCanvas.setFontSize('48')
							}else if(that.companyInfo.company_abbr.length > 10 && that.companyInfo.company_abbr.length <= 15){
								shareCanvas.setFontSize('32')
							}else if(that.companyInfo.company_abbr.length > 15){
								shareCanvas.setFontSize('26')
							}
						}
						
						shareCanvas.setTextAlign('center')
						
						// 公司名称
						function title() {
							const grds = shareCanvas.createLinearGradient(360, 795, 360, 826)
							shareCanvas.setFontSize('36')
							shareCanvas.setFillStyle('#e7c998')
							
							toFormateStr(shareCanvas, that.companyInfo.company_abbr, 400, 3, 360, 620, 40);
						}
						
						// 奖项
						function prize_title() {
							const grds = shareCanvas.createLinearGradient(360, 795, 360, 826)
							shareCanvas.setFontSize('36')
							shareCanvas.setFillStyle('#e7c998')
							
							toFormateStr(shareCanvas,that.companyInfo.prize.prize_title, 400, 3,360, 800, 40);
						}
						if(that.companyInfo.company_abbr){
							title()
						}
						prize_title()
									
						shareCanvas.setFontSize('24')
						shareCanvas.drawImage(that.src, 300, 1045, 120, 120)
						shareCanvas.draw(false, () => {
							uni.canvasToTempFilePath({
								canvasId: "shareCanvas",
								destWidth: 720, //分享图片尺寸=画布尺寸1*缩放比0.5*像素比21067
								destHeight: 1300,
								success(canvasres) {
									that.csimg = canvasres.tempFilePath
									uni.previewImage({
										urls: [canvasres.tempFilePath]
									})
									uni.hideLoading()
								},
							})
						})
					}
				})
				
			
			
			},
	}
}
相关推荐
计算机徐师兄4 小时前
Java基于SSM框架的互助学习平台小程序【附源码、文档】
小程序·互助学习·互助学习平台小程序·java互助学习微信小程序·互助学习微信小程序·互助学习平台微信小程序
西农小陈6 小时前
Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器
开发语言·python·小程序·pycharm·numpy·pyqt·pillow
说私域8 小时前
开源AI智能名片2+1链动模式S2B2C商城小程序:重塑私域流量运营格局
人工智能·小程序·流量运营
林涧泣8 小时前
【Uniapp-Vue3】解决uni-popup弹窗在安全区显示透明问题
前端·vue.js·uni-app
Colinnian11 小时前
微信小程序中在一个大边框里给每个小边框均匀分配空间
微信小程序·小程序·notepad++
说私域1 天前
今日头条公域流量引流新径:开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序融合之道
人工智能·小程序
曾经的三心草1 天前
小程序-基础加强
小程序·基础加强
说私域1 天前
智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力
人工智能·小程序·自动驾驶
说私域1 天前
开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究
人工智能·小程序·开源
css趣多多1 天前
认识小程序页面,小程序的宿主环境
小程序