查看手机演示

# poster 海报

uniapp 海报制作,通过提供的组件实例方法,进行画布绘画,几行代码生成想要的海报

# 平台兼容

H5 微信小程序 APP(ios/Android)

# 快速使用

注意

该canvas组件只提供画布渲染,不展示占用dom页面,返回一个base64 本地图片地址, 并且通过调用链型方法顺序作为层级

提示

强烈推荐:canvas画布组件width和height建议与展示的图片元素 宽高一致,在绘画时就能更好的设置x、y、宽高,生成的图片完整。

1.挂载画布组件,设置画布组件的宽高

	<k-poster ref="poster" :width="500" :height="800"></k-poster>
	<image :src="src" style="width: 500rpx;height: 800rpx;" ></image>

2.获取画布组件的实例,进行初始挂载方法及实例 (必须在mounted后调用,不然dom没生成获取不到元素节点)

	async mounted() {
				let posterRef = this.$refs.poster;
				await posterRef.init(); //第一步必须 调用init()初始化组件
				
				// 链型绘画(最后调用.draw()方法渲染返回promise数据的图片url)
				let src = await posterRef
					.setBackgroundColor("#ffffff") //设置画布背景色
					.addImage("https://img1.baidu.com/it/u=3286720786,1295176663&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750",20, 20, 450, 600) //添加照片
					.addText("超级猫咪~_~", 20, 640, 30, "#414141") //添加文字
					.addText("扫码进入KK音乐=>", 20, 730, 30, "#ff0000")
					.addRect(20, 690, 450, 10, "#a8a8a8") //添加一个矩形
					.addQRCode("https://www.baidu.com", 20, 20, 130, 130) //添加二维码(文本内容:自动生成二维码)
					.draw(); //执行渲染
				
				this.src = src
			},
	},

# API

# 组件值

参数 说明 类型 默认值 必传
width 画布的宽度,单位为 rpx number 0
height 画布的高度,单位rpx number 0

# 组件实例链型方法(function)

 init()                                              //初始化实例以及所有链型方法
 setBackgroundColor(String)                          //设置画布背景色 =》 参数为: (颜色值) 
 addImage(url , x , y , width , height , fasle )     //添加图片 =》 参数为: (url地址,x轴,y轴,宽度,高度,是否绘制为圆形)  [6个参数,最后一个设为true则绘制圆形图] 
 addText(string , x , y , size , string)             //添加文字 =》 参数为: (文本,x轴,y轴,文字大小,颜色值) 
 addRect(x , y , width , height)                     //添加矩形 =》 参数为: (x轴,y轴,宽度,高度) 
 addQRCode(url , x , y , width , height)             //添加二维码 =》参数为: (url地址,x轴,y轴,宽度,高度)  [自动生成以url地址的二维码图片并添加画布] 
 draw()                                              //执行渲染 [实例返回pomise数据的图片url]   

# 使用例子(生成本地图片url)

<template>
	<view class="content">

		<image :src="src" style="width: 500rpx;height: 800rpx;" v-if="src != ''"></image>

		<view class="btnList">
			<view class="button" @click="setCanvasImg">生成海报</view>
			<view class="button red" @click="downloadImg">下载海报</view>
		</view>


		<!-- canvas画布渲染器:不展示dom,返回生成后的图片base64 -->
		<k-poster ref="poster" :width="500" :height="800"></k-poster>

	</view>
</template>
<script>

	export default {
		data() {
			return {
				posterRef: null, //k-canvas组件实例
				src: '', //canvas绘画后生成的图片本地url
			}
		},
		async mounted() {
			this.init()
		},

		methods: {
			/* 1、获取canvas,初始化该组件的实例(初始后才能调用方法) */
			async init() {
				this.posterRef = this.$refs.poster;
				await this.posterRef.init();
			},

			/*/2、绘画canvas并生成图片url */

			async setCanvasImg() {
				uni.showLoading({
					title: "渲染海报中"
				});

				let src = await this.posterRef
					.setBackgroundColor("#ffffff") //设置画布背景色
					.addImage(
						"https://img1.baidu.com/it/u=3286720786,1295176663&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750",
						20, 20, 450, 600) //添加照片
					.addText("超级猫咪~_~", 20, 640, 30, "#414141") //添加文字
					.addText("扫码进入KK音乐=>", 20, 730, 30, "#ff0000")
					.addRect(20, 690, 450, 10, "#a8a8a8") //添加一个矩形
					.addQRCode("http://119.91.237.178/home", 20, 20, 130, 130) //添加二维码(文本内容:自动生成二维码)
					.draw(); //最后:执行渲染(返回promise数据的图片url)

				this.src = src
				uni.hideLoading();
			},

			/* 保存为本地图片 */
			downloadImg() {
				let posterRef = this.$refs.poster;
				posterRef.saveImageToPhotosAlbum(this.src).then(() => {
					console.log('保存图片成功');
				}).catch((e) => {
					console.warn('保存图片失败');
				});
			}

		},

	}
</script>
<style>
	page {
		background-color: #e8e8e8;
	}

	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.btnList {
		width: 100%;
		display: flex;
		align-items: center;
		position: fixed;
		bottom: 0;
		left: 0;
		padding: 20rpx 0;
	}


	.button {
		flex: 1;
		height: 80rpx;
		color: #fff;
		display: flex;
		justify-content: center;
		align-items: center;
		background-color: #00b3ff;
		box-shadow:inset 0  0  10rpx 4rpx #b9b9b9;
		margin: 15rpx;
	}

	.red {
		background: #f40307;
	}
</style>