微信小程序绘制海报


在小程序中引入 Wxml2Canvas 库。
在 wxml 文件中创建需要转换成图片的元素
`




绘制海报标题


<button @click=“drawMyCanvas”>绘制海报

import Wxml2Canvas from 'wxml2canvas';
export default {
   
	data() {
   
		return {
   
			imgUrl: '',
			width: 0,
			height: 0
		};
	},
	onLoad() {
   },
	onReady() {
   },
	methods: {
   
		drawMyCanvas() {
   
			Taro.showLoading();
			const that = this;
			const query = Taro.createSelectorQuery().in(this);
			query
				.select('#my-canvas')
				.fields(
					{
   
						// 选择需要生成canvas的范围
						size: true,
						scrollOffset: true
					},
					data => {
   
						let width = data.width;
						let height = data.height;
						that.width = width;
						that.height = height;
						that.startDraw();
					}
				)
				.exec();
		},
		startDraw() {
   
			console.log(2);
			let that = this;
			// 创建wxml2canvas对象
			let drawMyImage = new Wxml2Canvas(
				{
   
					element: 'myCanvas', // canvas的id,
					obj: that, // 传入当前组件的this
					width: that.width * 2,
					height: that.height * 2,
					progress(percent) {
   
						// 进度
						// console.log(percent);
					},
					finish(url) {
   
						console.log(url);
						// 生成的图片
						wx.hideLoading();
						that.savePoster(url);
					},
					error(res) {
   
						// 失败原因
						console.log(res);
						wx.hideLoading();
					}
				},
				this
			);
			let data = {
   
				// 获取wxml数据
				list: [
					{
   
						type: 'wxml',
						class: '.my_canvas .my_draw_canvas', // my_canvas要绘制的wxml元素根类名, my_draw_canvas单个元素的类名(所有要绘制的单个元素都要添加该类名)
						limit: '.my_canvas', // 要绘制的wxml元素根类名
						x: 0,
						y: 0
					}
				]
			};
			// 绘制canvas
			drawMyImage.draw(data, this);
		},
		savePoster(imgUrl) {
   
			const that = this;
			Taro.saveImageToPhotosAlbum({
   
				filePath: imgUrl,
				success: function() {
   
					Taro.showToast({
   
						title: '保存成功',
						icon: 'none',
						duration: 1500
					});
				},
				fail(err) {
   
					if (
						err.errMsg === 'saveImageToPhotosAlbum:fail:auth denied' ||
						err.errMsg === 'saveImageToPhotosAlbum:fail auth deny' ||
						err.errMsg === 'saveImageToPhotosAlbum:fail authorize no response'
					) {
   
						Taro.showModal({
   
							title: '提示',
							content: '需要您授权保存相册',
							showCancel: false,
							success: modalSuccess => {
   
								Taro.openSetting({
   
									success(settingdata) {
   
										if (settingdata.authSetting['scope.writePhotosAlbum']) {
   
											Taro.saveImageToPhotosAlbum({
   
												filePath: imgUrl,
												success: function() {
   
													Taro.showToast({
   
														title: '保存成功',
														icon: 'success',
														duration: 2000
													});
												}
											});
										} else {
   
											Taro.showToast({
   
												title: '授权失败,请稍后重新获取',
												icon: 'none',
												duration: 1500
											});
										}
									}
								});
							}
						});
					}
				
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序通过 Canvas 2D 绘制海报可以用于商品展示、广告宣传等场景。下面介绍一下实现流程: 1. 页面结构 在页面中添加一个 Canvas 标签,设置 id 和宽高: ```html <canvas id="poster" style="width: 750rpx; height: 1334rpx;"></canvas> ``` 2. 获取 Canvas 上下文 在页面的 onLoad 函数中获取 Canvas 上下文: ```javascript let ctx = wx.createCanvasContext('poster'); ``` 3. 绘制背景 使用 Canvas 2D 绘制背景,可以使用 fillRect 方法绘制一个填充矩形: ```javascript ctx.setFillStyle('#ffffff'); ctx.fillRect(0, 0, 750, 1334); ``` 4. 绘制图片 使用 drawImage 方法绘制图片,需要先将图片下载到本地: ```javascript wx.getImageInfo({ src: 'https://example.com/image.png', success: function(res) { ctx.drawImage(res.path, 0, 0, 750, 500); } }); ``` 5. 绘制文本 使用 fillText 或者 strokeText 方法绘制文本,需要设置字体样式和对齐方式: ```javascript ctx.setFontSize(32); ctx.setTextAlign('center'); ctx.fillText('这是一段文本', 375, 600); ``` 6. 保存海报 使用 Canvas 2D 的 toTempFilePath 方法将绘制海报保存到本地: ```javascript ctx.draw(false, function() { wx.canvasToTempFilePath({ x: 0, y: 0, width: 750, height: 1334, canvasId: 'poster', success: function(res) { console.log(res.tempFilePath); } }); }); ``` 完整代码: ```javascript Page({ onLoad: function() { let ctx = wx.createCanvasContext('poster'); ctx.setFillStyle('#ffffff'); ctx.fillRect(0, 0, 750, 1334); wx.getImageInfo({ src: 'https://example.com/image.png', success: function(res) { ctx.drawImage(res.path, 0, 0, 750, 500); } }); ctx.setFontSize(32); ctx.setTextAlign('center'); ctx.fillText('这是一段文本', 375, 600); ctx.draw(false, function() { wx.canvasToTempFilePath({ x: 0, y: 0, width: 750, height: 1334, canvasId: 'poster', success: function(res) { console.log(res.tempFilePath); } }); }); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值