首页 > 编程语言 >uniapp 微信小程序使用canvas

uniapp 微信小程序使用canvas

时间:2023-12-08 19:24:58浏览次数:34  
标签:uniapp canvas img 微信 ctx height width uni

微信小程序基础库大于2.9.0后,canvas(画布)支持一套新 Canvas 2D 接口(需指定 type 属性),同时支持同层渲染,原有接口不再维护。在这种情况下使用原有接口会报错,报错例如:

1、使用ctx.draw()会报错:draw is not a function,原因:新版 Canvas 2D 接口没有 draw 方法

2、使用ctx.setfillStyle('white')会报错:ctx.setfillStyle is not a function,原因:新版 Canvas 2D 接口没有setfillStyle方法,改用fillStyle

3、使用ctx.setFontSize(20)会报错:ctx.setFontSize is not a function,原因:新版 Canvas 2D 接口没有setFontSize方法,改用font

4、使用wx.canvasToTempFilePath会报错:canvasToTempFilePath: fail canvas is empty,原因:当使用Canvas 2D时,应该使用canvas属性而不是canvasId属性

以上均是使用Canvas 2D之后导致的问题,可以改用新写法,新写法如下:

<template>
	<view>
		<uni-nav-bar leftIcon="arrowleft" :status-bar="true" fixed="true" color="#ffffff" bgImage="linear-gradient(45deg, #ec008c, #6739b6)"  title="移动开发框架" />
		
		<view class="drawBtn">生成图片</view>
		
		<!-- 画布 -->
		<canvas type="2d" class='canvas-poster' canvas-id='canvasposter' id="canvasposter"></canvas>
	</view>
</template>

<script>
	import uniNavBar from '@/components/uni-nav-bar/uni-nav-bar.vue'
	export default {
		data() {
			return {
				
			}
		},
		components: {
			uniNavBar
		},
		onLoad() {
			
		},
		methods: {
			//绘制到canvas
			viewDrawToCanvas: function() {
                let that = this
				const query = uni.createSelectorQuery()
				query.in(this).select('#canvasposter')
					.fields({
						node: true,
						size: true
					})
					.exec((res) => {
						const canvas = res[0].node // 获取画布节点对象
						const ctx = canvas.getContext('2d')
						canvas.width = 626  // 画布宽度
						canvas.height = 508 // 画布高度
						ctx.rect(0, 0, canvas.width, canvas.height)
						ctx.fillStyle = 'white' // 设置样式
						ctx.fillRect(0, 0, canvas.width, canvas.height)
						// 画布填充文字
						ctx.font = '28px SimSun' // 设置文字样式
						ctx.fillStyle = '#333333'
						ctx.fillText('文案', 16, 56)				
						// 图表图片
						let img = canvas.createImage()
						img.src = imgBase64
						img.onload = () => {
							ctx.drawImage(img, 0, 0, img.width, img.height, 50, 170, img.width * 0.7, img.height * 0.7)
							uni.canvasToTempFilePath({
								canvas: canvas,
								width: canvas.width,
								height: canvas.height,
								destWidth: canvas.width,
								destHeight: canvas.height,
								fileType: 'png',
								quality: '1',
								success: (res) => {
									console.log(res.tempFilePath)
								    that.saveImageToPhotosAlbum(res.tempFilePath)//保存到相册
								},
								fail: (err) => {
									console.log(err)
								}
							})
						}
					})

			},
			//把生成的图片保存至相册
			saveImageToPhotosAlbum: function(imgUrl) {
				uni.hideLoading();
				if (imgUrl) {
					uni.saveImageToPhotosAlbum({
						filePath: imgUrl,
						success: (res) => {
							uni.showToast({
								title: '保存成功',
								icon: 'success',
								duration: 2000
							})
						},
						fail: (err) => {
							uni.showToast({
								title: '保存失败',
								icon: 'none',
								duration: 2000
							})
						}
					})
				} 
				else {
					uni.showToast({
						title: '绘制中……',
						icon: 'loading',
						duration: 3000
					})
				}
			},
		}
	}
</script>

<style>
	.drawBtn{
		width: 650upx;
		height: 80upx;
		line-height: 80upx;
		text-align: center;
		color: #FFFFFF;
		background-image: linear-gradient(45deg, #ec008c, #6739b6);
		border-radius: 20upx;
		margin: 200upx 50upx;
	}
	
	/* 绘制图片canvas样式 */
	.canvas-poster {
		position: fixed;
		width: 794px;
		height: 1123px;
		top: 100%;
		left: 100%;
	}
</style>            

 

标签:uniapp,canvas,img,微信,ctx,height,width,uni
From: https://www.cnblogs.com/Intellectualscholar/p/17888800.html

相关文章

  • 记录--优雅解决uniapp微信小程序右上角胶囊菜单覆盖问题
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言大家好,今天聊一下在做uniapp多端适配项目,需要用到自定义导航时,如何解决状态栏塌陷及导航栏安全区域多端适配问题,下文只针对H5、APP、微信小程序三端进行适配,通过封装一个通用高阶组件包裹自定义导航栏内容,主......
  • 基于个人微信号的机器人的开发
    简要描述:设置好友权限本接口修改成功后手机需退出后台,重新打开手机方可看到更改请求URL:http://域名地址/setFriendPemission请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String微信实列IDwcId是String好友微信i......
  • 用html+css+js做canvas烟花模拟网页动画代码
    圣诞节、元旦就要到了,本案例我们将用html+css+js做canvas烟花模拟网页动画代码,程序员的浪漫这不就来了嘛,与家人朋友一起看烟花吧!   附源码<!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"/> <title>烟花模拟器</title> <metaname="viewport"......
  • 实现个人微信机器人的开发
    简要描述:修改好友备注请求URL:http://域名地址/modifyRemark请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是string登录实例标识wcId是string好友微信idremark是string好友......
  • 微信公众号网页中打开高德地图
    toDaohang(point){letthat=this//打开高德Dialog.confirm({title:'',message:'打开高德地图',}).then(()=>{letstr=[]if(point!=''){str=p......
  • uniapp滑动页面时警告Unable to preventDefault inside passive event listener due t
    翻译:没有添加被动事件监听器来阻止’touchstart‘事件,请考虑添加事件管理者’passive’,以使页面更加流畅。原因:由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 preventDefault(),这就导致了浏览器不能及时响应滚动,略有延迟。所以为了让页面滚动的效果如丝般顺滑......
  • 【UniApp】-uni-app-全局数据和局部数据
    前言好,经过上个章节的介绍完毕之后,了解了一下uni-app-全局样式和局部样式那么了解完了全局样式和局部样式之后,这篇文章我再来给大家介绍一下UniApp中全局数据和局部数据搭建演示环境创建一个全新的项目:然后在配置一下,微信小程序的AppId,直接去之前的项目中拷贝一下即......
  • 分享一个微信红包封面过审方法
    大家好,我是小悟兄弟们,已经12月份了,今年的最后一个月,距离过年还有两个月左右,如果你需要制作微信红包封面,我建议你现在就可以着手了。一方面,临近春节,会有很多人在制作红包封面,审核时长就会比较久。另一方面,最重要的是,制作一款心仪的红包封面,到审核通过,这个过程不是那么尽如人意的,是持......
  • 【UniApp】-uni-app概述
    前言好,经过我们前面文章的编写,大家可以了解到微信小程序开发相关的知识,了解完了这个微信小程序开发和云开发之后,从这篇文章开始,我再来给大家写一下关于Uniapp的知识。好,开始,那什么是Uniapp呢?这个时候我们不管三七二十一,先打开我们Uniapp官方文档,它官方地址也很简单,叫做d......
  • 【Nginx/IIS】解决uniapp/Vue history模式下页面刷新404
    uniapp/Vue开启History模式本地开发:二级页面刷新或者通过链接进入二级页面是正常的打包部署后:二级页面刷新或者通过链接进入二级页面会报错404页面找不到 解决方案:Nginx配置:在nginx.conf的对应location里配置一行代码try_files$uri$uri//index.html;location/h5{......