uniapp中使用canvas 画海报总结

一、canvas 首先创建一个canvas标签,下面的事件是为了你点击海报的时候是会报错 的,你需要定义一个事件,return就可以了!如图:

<canvas class="canvas" canvas-id="myCanvas"  @touchmove.stop.prevent="moveHandle" ></canvas><!-- 海报 -->

二、首先我们要是一开始就画图的话需要在mounted的调用就可以了。

三、画图代码如图:

注意的点:

  1. 网络图片需要转化成本地图片在进行画质,微信头像有的是http的我们需要给他添加一下s,不然上线是画的时候是会报错的。
  2. 画圆图的时候需要使用到clip,再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内,(所以一把裁剪写在最后面,画的东西的层级是后面画的层级都比前面的高的。要是需要在裁剪之后需要添加图片的话,目前我还没有解决的方法,等以后发现了在更新。。。)
  3. 就是在一个页面重复画质的话是需要在外层套一个hidden属性来控制页面销毁了从新生成,清空canvas。如图:
<view class="toPoster dpf fdc aic jcc" :hidden="canvasFlag">
//初始化的时候给true,开始画的时候给他false,让他展示出来(就可以一直画了哦)
  1. 关于手机适配的问题(每个手机的屏幕不一样,我们需要求出他们之间的通用分辨率)如下:
            this.message=uni.getSystemInfoSync();//获取手机信息
			this.powerw=this.message.windowWidth/375
			//一般屏幕的标准是375,我们用机型的宽度除以375就是他们的比例了,画图的时候尺寸直接乘以比例就可以适配了哦。
			
  1. 画图的代码如下:(api需要自己去百度都可以知晓怎么使用的哦!)
async createCanvasImage() {
				this.canvasFlag=false
				uni.showLoading({
					title: '海报生成中...'
				})
				let _this = this;
				let powerw=_this.powerw
				let ctx = uni.createCanvasContext('myCanvas', this);
				console.log(uni.getStorageSync("userInfo"), "useinfo")
				let url ='https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eqG1yIlJaiaSz3ibbhw3u1OWpKc0Nq5IfFAxlXcQnK71QOarrawESLHHFEibhyGl24SuaBgC4VIratdQ/132'; //头像图片
				
				let useName ="T.F";
				let code='https://scrm.ocheng.me/storage/M00/06/A5/CmUACF_QYYGAI4YYAAFxYrMxZ1834.jpeg';//二维码
				// let code = this.qrcode
				let backUrl = _this.$fileUrl() + 'M00/0A/C6/CmUAB1_QMFWALgHNAAu1pIZD2i8535.png'; //背景图片
				let maozi = _this.$fileUrl() + 'M00/06/A5/CmUACF_QQoGAFkx7AAAZFKfUWpE724.png'; //帽子

				ctx.draw() //清空原来的画图内容
				ctx.save();
				ctx.fillStyle = "#fff";
				ctx.fillRect(0, 0, 280, 470);
				ctx.restore(); //恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 可以继续绘制
				//显示背景图片
				
				await uni.getImageInfo({
					src: backUrl,
				}).then(item => {
					if (item[1].errMsg == 'getImageInfo:ok') {
						ctx.save();
						ctx.drawImage(item[1].path, 0, 0,300*powerw,450*powerw); //绘制图
						ctx.restore();
						// ctx.draw(true)

					} else {
						this.canvasFlag=true
						uni.showToast({
							title: '海报生成失败',
							duration: 2000,
							icon: 'none'
						});
					}
					console.log(item)
				})
				
				//二维码
				await uni.getImageInfo({
					src: code,
				}).then(result => {
					console.log(result,"res1")
					if (result[1].errMsg == 'getImageInfo:ok') {
						ctx.save();
						ctx.drawImage(result[1].path, 109*powerw, 260*powerw,77*powerw,74*powerw); //绘制图
						ctx.restore();
						// ctx.draw(true)
					} else {
						this.canvasFlag=true
						uni.showToast({
							title: '海报生成失败',
							duration: 2000,
							icon: 'none'
						});
					}
				})
				
				// 绘画nickname
				ctx.shadowColor = 'rgba(0, 0, 0, 0.2)';

				ctx.setFillStyle('#FFFFFF')//文字颜色:默认黑色
				ctx.setFontSize(12)//设置字体大小,默认10
				ctx.textAlign = 'center'	// 设置位置
				ctx.font = 'normal 16px sans-serif';	// 字体样式
				ctx.fillText('你是傻逼吧',150*powerw, 154*powerw);
				//显示头像
				await uni.getImageInfo({
					src: url,
				}).then(res => {
					if (res[1].errMsg == 'getImageInfo:ok') {
						ctx.beginPath(); //开始绘制
						let grd = ctx.createLinearGradient(160*powerw, 130*powerw, 25*powerw, 0,)
						grd.addColorStop(0, "#f7cb6b");
						grd.addColorStop(0, "#fba980");
						ctx.lineWidth = 4;
						ctx.strokeStyle = grd;
						ctx.beginPath();
						//先画个圆
						ctx.arc(150*powerw, 110*powerw, 25*powerw, 0, Math.PI * 2);
						ctx.setFillStyle('#ffffff')
						ctx.fill() //保证图片无bug填充
						ctx.clip(); //画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内
						ctx.drawImage(res[1].path, 130*powerw, 86*powerw, 50*powerw, 50*powerw); //绘制图
						ctx.stroke();
						ctx.restore();
						// ctx.draw(true)
					} else {
						this.canvasFlag=true
						uni.showToast({
							title: '海报生成失败',
							duration: 2000,
							icon: 'none'
						});
					}
				})
				ctx.draw()
				uni.hideLoading();
		
				
			

			},
  1. 保存图片在手机上面,如下:
save(){
				console.log('点击了保存')
				uni.showLoading({
					title: '保存中...'
				})
				
				let _this = this;
				// 1-把画布转化成临时文件
				uni.canvasToTempFilePath({
					x: 0,
					y: 0,
					width:300, // 画布的宽
					height:500, // 画布的高
					// destWidth: this.phoneW * 3,
					// destHeight: 510 * 7,
					canvasId: 'myCanvas',
					success(res) {
						// 2-保存图片至相册
						uni.saveImageToPhotosAlbum({
							filePath: res.tempFilePath,
							success(res2) {
								uni.hideLoading();
								uni.showToast({
									title: '图片保存成功',
									duration: 2000
								})
								_this.canvasFlag=false
								// _this.canvasCancelEvn();
								
							},
							fail(err) {
								uni.hideLoading();
								
								uni.showToast({
									title: '保存失败,稍后再试',
									duration: 2000,
									icon: 'none'
								})
								
								_this.getAuth=true
								
							}
						},this)
					},
					fail(err) {
						console.log(err,"err")
						uni.showToast({
							title: '保存失败,稍后再试',
							duration: 2000,
							icon: 'none'
						})
						uni.hideLoading();
						_this.canvasFlag=false
					}
				},this)
				
			},
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp,你可以使用canvas来绘制和生成海报。首先,你需要将网络图片下载到本地,可以使用uni.downloadFile函数来实现。使用该函数将网络图片下载到本地后,你可以将其转换为base64格式。你可以使用pathToBase64函数将图片路径转换为base64编码。接下来,你可以使用canvas来渲染海报,将下载并转换后的图片绘制在canvas上。最后,你可以通过uni.canvasToTempFilePath函数将canvas导出为临时文件,从而生成海报。你可以将导出的海报保存到本地或者分享给其他用户。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [uniapp 生成海报图片base64转换 ](https://download.csdn.net/download/qq_36003998/12330793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [uniapp使用canvas海报](https://blog.csdn.net/Yadira9/article/details/128726482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [uniapp使用canvas海报二维码](https://blog.csdn.net/Blue54/article/details/124832963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值