uni-app 实现图片上传添加水印操作

这篇具有很好参考价值的文章主要介绍了uni-app 实现图片上传添加水印操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、定义一个canvas标签,微信小程序的实现方式有所变动

	<!-- #ifdef MP-WEIXIN -->
	<canvas type="2d" id="upload-canvas" class="uploadCanvas" 
		:style="{'width':width+'px','height':height+'px','position':'absolute','z-index':'-999','left':'-1000000px'}"></canvas>
	<!-- #endif -->

	<!-- #ifdef H5 -->
	<canvas canvas-id="upload-canvas" class="uploadCanvas" 
		:style="{'width':width+'px','height':height+'px','position':'absolute','z-index':'-999','left':'-1000000px'}"></canvas>
	<!-- #endif -->

二、拿到图片后添加水印

addWatermark(fileUrl) {
			let that = this;
			return new Promise((resolve, reject) => {

				uni.getImageInfo({
					src: fileUrl, // 替换为你的图片路径
					success: async (res) => {
						console.log("res", res);
						const imageWidth = res.width;
						const imageHeight = res.height;
						that.width = imageWidth;
						that.height = imageHeight;
						await util.sleep(1000);
						// #ifdef MP-WEIXIN
						const query = wx.createSelectorQuery()
						query.select('#upload-canvas')
							.fields({
								node: true,
								size: true
							})
							.exec((resCanvas) => {
								let filePath = res.path;
								// 获取文件系统管理器
								const fs = uni.getFileSystemManager();
								// 读取图片文件为Base64编码
								fs.readFile({
									filePath: filePath,
									encoding: 'base64',
									success: function(res) {
										const base64Data = res.data;
										console.log("base64Data==",base64Data)
										const canvas = resCanvas[0].node
										canvas.width = that.width;
										canvas.height = that.height;
										const ctx = canvas.getContext('2d')
										let img = canvas
											.createImage(); // 注意是使用canvas实例 不是ctx
										img.src =
											`data:image/png;base64,${base64Data}`
										img.onload = () => {
											ctx.drawImage(img, 0, 0,that.width,that.height);
											ctx.font = '16px',
												ctx.fillStyle =
												'rgba(0, 0, 0, 1)';
											const lineHeight = 20; // 水印文字行高

											const lines = that.watermarkText
												.split('\n');
											const x = 10; // 水印左上角 x 坐标
											let y = 20; // 水印左上角 y 坐标

											lines.forEach((line) => {
												ctx.fillText(line, x,
													y);
												y += lineHeight;
											});
											ctx.stroke();
											// 保存Canvas绘制结果为临时文件
											uni.canvasToTempFilePath({
												canvas: canvas,
												success: (res) => {
													// 将临时文件路径保存到数组中
													resolve(res
														.tempFilePath
													)
												},
												fail: (error) => {
													console.error(
														'Failed to save canvas:',
														error);
												},
											});


										}
									},
									fail: function(error) {
										console.log("eee", error);
									}
								});

							})
						// #endif

						// #ifdef H5
						const ctx = uni.createCanvasContext('upload-canvas', this);
						ctx.drawImage(res.path, 0, 0, imageWidth,
							imageHeight);
						ctx.setFontSize(16);
						ctx.setFillStyle('rgba(0, 0, 0, 1)'); // 设置水印颜色和透明度
						const lineHeight = 20; // 水印文字行高
						const lines = that.watermarkText
							.split('\n');
						const x = 10; // 水印左上角 x 坐标
						let y = 20; // 水印左上角 y 坐标

						lines.forEach((line) => {
							ctx.fillText(line, x,
								y);
							y += lineHeight;
						});
						ctx.stroke();
						ctx.draw(false, () => {
							// 保存Canvas绘制结果为临时文件
							uni.canvasToTempFilePath({
								canvasId: 'upload-canvas',
								success: (res) => {
									// 将临时文件路径保存到数组中
									resolve(res.tempFilePath)
								},
								fail: (error) => {
									console.error('Failed to save canvas:',
										error);
								},
							}, this);
						});
						// #endif
					},
					fail: (error) => {
						console.error(error);
					},
				});
			})
		},

三、改进版本

改进原因:
1、Canvas 2D(新接口)需要显式设置画布宽高,默认:300150,最大:13651365
ios 无法上传较大图片的尺寸,固对超过此尺寸的图片进行了等比缩放的处理;

2、在页面中设置canvas宽高,导致页面有滚动条;现在采用离屏的canvas,但是离屏的canvas,canvasToTempFilePath方法又不支持,故先把canvas转化为base64,然后存储到本地文件,然后再读一遍文件文章来源地址https://www.toymoban.com/news/detail-726538.html

	addWatermark(fileUrl) {
			let that = this;
			return new Promise((resolve, reject) => {
				uni.getImageInfo({
					src: fileUrl,
					fail: (error) => {}, // 替换为你的图片路径
					success: async (res) => {
						console.log("res", res);

						let radio = 1365 / Math.max(res.width, res.height)
						let imageWidth = Math.round(res.width * radio)
						let imageHeight = Math.round(res.height * radio)

						that.width = imageWidth;
						that.height = imageHeight;
						// #ifdef MP-WEIXIN
						let filePath = res.path;
						// 获取文件系统管理器
						const canvas = wx.createOffscreenCanvas({
							type: '2d',
							width: imageWidth,
							height: imageHeight
						})
						let img = canvas.createImage(); // 注意是使用canvas实例 不是ctx
						// 等待图片加载
						await new Promise(resolve => {
							img.onload = resolve
							img.src = filePath; // 要加载的图片 url
						})


						canvas.width = imageWidth;
						canvas.height = imageHeight;
						const ctx = canvas.getContext('2d')
						ctx.drawImage(img, 0, 0, imageWidth,
							imageHeight);
						ctx.font = '28px arial',
							ctx.fillStyle =
							'rgba(255, 255, 255, 1.0)';
						const lineHeight = 50; // 水印文字行高

						const lines = that.watermarkText
							.split('\n');
						const x = 40; // 水印左上角 x 坐标
						let y = imageHeight -
							200; // 水印左上角 y 坐标
						// 文字添加阴影效果
						ctx.shadowColor = 'black';
						ctx.shadowBlur = 5;
						ctx.shadowOffsetX = 2;
						ctx.shadowOffsetY = 2;
						// 添加水印图标
						lines.forEach((line) => {
							ctx.fillText(line, x,
								y);
							y += lineHeight;
						});
						// 设置线条颜色和宽度
						ctx.strokeStyle = '#fff'; // 设置线条颜色为白色
						ctx.lineWidth = 3; // 设置线条宽度为 3 像素
						// 绘制竖线
						ctx.beginPath(); // 开始路径
						ctx.moveTo(20, imageHeight -
							220); // 移动到起点坐标 (x, y)
						ctx.lineTo(20, imageHeight -
							100); // 画一条竖线到终点坐标 (x, y)

						ctx.stroke();
						// 保存Canvas绘制结果为临时文件

						//ios不兼容
						if (this.navBarHeight == 44) {
							console.log('ios上传');
							//if (true) {
							//string type
							//图片格式,默认为 image/png
							//number encoderOptions
							//在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。
							let base64 = canvas.toDataURL("image/png", 0.8);
							const time = new Date().getTime();
							const imgPath = wx.env.USER_DATA_PATH + "/poster" + time + "upload" +
								".png";
							//如果图片字符串不含要清空的前缀,可以不执行下行代码.
							const imageData = base64.replace(/^data:image\/\w+;base64,/, "");
							const fs = wx.getFileSystemManager();
							fs.writeFileSync(imgPath, imageData, "base64");
							fs.close()

							wx.getImageInfo({
								src: imgPath,
								success: (res) => {
									console.log("读取写入的文件", res)
									resolve(res.path)
								},
								fail: (res) => {
									console.log("读取写入的文件失败", res)
								}
							})

						} else {
							console.log('android 上传');
							uni.canvasToTempFilePath({
								canvas: canvas,
								fileType: "jpg",
								success: (res) => {
									uni.compressImage({ //图片压缩
										src: res
											.tempFilePath,
										success: (
											res) => {
											// // 将临时文件路径保存到数组中
											resolve(res
												.tempFilePath
											)
										}
									})
								},

								fail: (error) => {
									console.error(
										'Failed to save canvas:',
										error);
								},
							});
						}
					}
					// #endif
				});
			})
		},

到了这里,关于uni-app 实现图片上传添加水印操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传)

    uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传)

    前言 最近在使用uni-app写H5移动端,有一个从手机拍摄从相册选择获取图片上传到文档服务器功能。 查阅uni-app发现关于上传图片,uni-file-picker文件上传,uni.chooseImage,uni.uploadFile H5上传时它和pc端原理差不多,都是file对象上传,PC端是通过new file对象,uni-app是直接提供了 微信

    2024年02月15日
    浏览(49)
  • uni-app实现水印相机

    uni-app实现水印相机

    点击“拍照”,拍照成功后在底部生成已经添加上水印的图片,点击图片查看图片 为了让自定义的按钮如:旋转镜头、打开/关闭 闪光灯、拍摄等能够位于 camera 组件上层,所以容器都采用 cover-view、cover-image 需要提前下载腾讯地图微信小程序JavaScript SDK,实现定位功能 本文章

    2024年02月07日
    浏览(9)
  • 【uni-app】上传图片 uni.chooseImage(),uni.uploadFile()接口使用

    【uni-app】上传图片 uni.chooseImage(),uni.uploadFile()接口使用

    图片上传在实际场景中使用广泛,例如商品图片,汽车图片等等 实现选择单张图片上传,可以删除图片。(预览功能时间原因未研究) Vue2 版本,使用uni-app框架api唤起手机相册等图片源,将图片选中到目标列表,并发送到服务器存储,存储成功得到处理后的图片名称存储到

    2024年02月05日
    浏览(11)
  • uni-app 调用相机或相册图片并转为base64格式上传图片

    1、调用相机或相册上传图片 2、图片文件转base64 (1)下载插件 (2)页面引入插件 3、image-tools/index.js源码

    2024年02月11日
    浏览(45)
  • uni-app App和H5平台上传视频截取视频第一帧生成图片

    uni-app App和H5平台上传视频截取视频第一帧生成图片

    提示:因为uni-app中renderjs仅支持App和H5平台,所以该方案仅支持当前这两个平台。 this.request为本人封装的接口请求方法,可以替换成个人的接口请求方法,如有需要可在下方留言 因为uni-app App端没有dom概念,不支持dom操作,并且uni-app的canvas不支持绘制video。renderjs完美解决了

    2023年04月09日
    浏览(13)
  • uni-app开发微信小程序,H5 关于压缩上传图片的问题

    uni-app开发微信小程序,H5 关于压缩上传图片的问题

    文章目录 前言 一、为什么要压缩图片 二、图片压缩方式 1. 微信小程序​​​​​​​ 2. H5 总结 关于微信小程序、H5兼容性问题,今天就压缩以及上传图片做一个可实现方法的简要阐述。 在使用uni-app开发小程序及H5的具体业务中,我们会遇到需要让用户上传本地图片的场景

    2024年02月02日
    浏览(10)
  • 前端vue uni-app多图片上传组件,支持单个文件,多个文件上传 步骤条step使用

    前端vue uni-app多图片上传组件,支持单个文件,多个文件上传 步骤条step使用

    快速实现多图片上传组件,支持单个文件,多个文件上传 步骤条step使用; 阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下: 使用方法   使用方法 HTML代码部分   html JS代码 (引入组件 填充数据)   javascript

    2024年02月08日
    浏览(16)
  • uniapp实现上传图片添加日期和地点水印,修复多张图片同时上传,显示相同图片问题

    整体实现流程:首先调用 uni.chooseImage 方法,配置count、sizeType、sourceType参数,分别代表选择的图片个数、original 原图,compressed 压缩图,默认二者都有、是从相册还是拍照。 然后在成功的回调中拿到上传的所有图片并存储。然后就是添加水印,调用 uni-getImageInfo 拿图片信息,

    2024年02月12日
    浏览(8)
  • uni-app 实现文件上传

    在使用若依的框架时,发现若依移动端框架中已经封装好了一个upload.js用于文件上传,自己在这个版本的基础上稍作改动,成功实现文件上传功能 若依公共的 upload.js  自己再封装一个 js 文件,此处命名 upload.js 但不和若依的文件放在同一个目录下 在文件中调用需要先引入

    2024年02月11日
    浏览(15)
  • uni-app实现canvas绘制图片、海报等

    uni-app实现canvas绘制图片、海报等

    前段时间有个项目,需要绘制海报,我一听这不是可以用canvas来实现吗,所以我在五一假期就记录下实现方式 我把canvas绘制图片封装成一个组件,直接引入使用就好了。 这里虽然是uni-app写的,但实现方式其实都是一样的,之后其他原生小程序用到也是大差不大的,真的很简

    2024年02月09日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包