uni-app为图片添加自定义水印(解决生成图片不全问题)

时间:2025-04-25 08:11:27
export default { data() { return { waterMarkParams: { display: false, // 控制 canvas 创建与销毁 canvasWidth: 300, // 默认宽度 canvasHeight: 225, // 默认高度 contentHeight: 150, // 将要被绘制到图像中的矩形的高度(px) }, } }, computed: { canvasStyle() { return { position: 'fixed', // 移除到屏幕外 left: '9999px', width: this.waterMarkParams.canvasWidth + 'px', height: this.waterMarkParams.canvasHeight + 'px', } } }, methods: { chooseImage() { uni.chooseImage({ sourceType: ['all'], success: async ({ tempFilePaths, tempFiles }) => { // 这里就得到了带水印的图片路径列表 const imgFileArr = await this.callAddWaterMark(tempFilePaths) } }) }, // 因为有可能在相册中选择多个图片,所以这里要依次生成水印 async callAddWaterMark(imgPathArr) { let results = [] if(imgPathArr.length > 0) { let addIndex = 0 while(addIndex < imgPathArr.length) { const tempFilePath = await this.addWaterMark(imgPathArr[addIndex]) results.push(tempFilePath) addIndex = addIndex + 1 } } return results }, // 添加水印 addWaterMark(src) { return new Promise((resolve, reject) => { // 获取图片信息,配置 canvas 尺寸 uni.getImageInfo({ src, success: res => { // 修复部分手机(如红米9)手机屏幕比较窄拍摄出来的图片水印压缩着覆盖的问题 this.waterMarkParams.canvasWidth = Math.max(res.width, 886); this.waterMarkParams.canvasHeight = res.height; this.waterMarkParams.display = true console.log('当前图片信息waterMarkParams:', this.waterMarkParams); // 等待 canvas 元素创建 this.$nextTick(() => { let context = uni.createCanvasContext("waterMarkCanvas", this); /* 绘制 */ const { canvasWidth, canvasHeight, contentHeight } = this.waterMarkParams // 绘制前清空画布 context.clearRect(0, 0, canvasWidth, canvasHeight); // 将图片src放到cancas内,宽高必须为图片大小 context.drawImage(src, 0, 0, canvasWidth, canvasHeight, canvasWidth, canvasHeight); // 设置边框的透明度 context.setGlobalAlpha(0.3); context.beginPath(); // 绘制底部的白色背景 context.rect(0, canvasHeight - contentHeight, canvasWidth, contentHeight); context.setFillStyle("white"); context.fill(); // 设置文字的透明度 context.setGlobalAlpha(1); // 3.绘制底部的文字 context.setFontSize(32); context.setTextAlign("left"); context.setFillStyle("black"); context.fillText(`拍摄人:${this.$store.state.userModule.name}`, 50 , canvasHeight - 90 ); context.fillText(`拍摄时间:${this.$u.timeFormat(new Date(), "yyyy-mm-dd hh:MM:ss")}`, 50, canvasHeight - 40); // 一定要加上一个定时器否则进入到页面第一次可能会无法正常拍照,后几次才正常 setTimeout(() => { // 本次绘画完重开开始绘画,并且在绘画完毕之后再保存图片,不然页面可能会出现白屏等情况 context.draw(false, () => { console.log('!!!!!开始绘画', canvasWidth, canvasHeight); uni.canvasToTempFilePath({ canvasId: "waterMarkCanvas", fileType: "jpg", width: canvasWidth, height: canvasHeight, destWidth: canvasWidth, destHeight: canvasHeight, success: ({ tempFilePath }) => { console.log('绘制成功', tempFilePath); this.waterMarkParams.display = false resolve(tempFilePath) }, fail: err => { reject(err) console.log(err); } }, this) }) }, 1000); }) } }) }) }, } }