<template> <view class="content"> <view v-for="item in canvasArr"> <canvas canvas-id="myCanvas" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}"></canvas> </view> </view> </template> <script> export default { props: { }, data() { return { canvasArr: [], platformType: 'other', canvasWidth: '', canvasHeight: '', pixelRatio: 1 }; }, mounted() { let _this = this; // #ifdef H5 _this.platformType = 'h5'; // #endif wx.getSystemInfo({ success: function(data) { console.log(data); _this.pixelRatio = data.pixelRatio; } }); }, methods: { addWaterMark(options) { let _this = this; if (_this.platformType == 'h5') { _this.h5CanvasDraw(options); } else { _this.otherCanvasReady(options); } }, otherCanvasReady(options) { let _this = this; uni.getImageInfo({ src: options.url, success: function(img) { let size = options.maxSize || 0; if (options.maxSize) { if (img.width > img.height) { if (img.width < size) { size = img.width / _this.pixelRatio; } else { size = size / _this.pixelRatio } _this.canvasWidth = size; _this.canvasHeight = img.height / (img.width / size); } else { if (img.height < size) { size = img.height / _this.pixelRatio; } else { size = size / _this.pixelRatio } _this.canvasHeight = size; _this.canvasWidth = img.width / (img.height / size); } } else { _this.canvasWidth = img.width / _this.pixelRatio _this.canvasHeight = img.height / _this.pixelRatio } _this.canvasArr.splice(0, 1, 1); _this.$nextTick(function() { _this.otherCanvasDraw(options, img); }); } }); }, otherCanvasDraw(options, img) { let _this = this; const ctx = uni.createCanvasContext('myCanvas', _this) ctx.drawImage(img.path, 0, 0, _this.canvasWidth, _this.canvasHeight) ctx.textAlign = options.textAlign || 'top' ctx.textBaseline = options.textBaseline || 'top' let imageArr = []; let textArr = []; options.watermark.some(function(item, index) { if (item.type == 'image') { imageArr.push(item); } if (item.type == 'text') { textArr.push(item); } }) textArr.some(function(item, index) { ctx.font = (item.font || '16px') + ' Arial' ctx.shadowColor = item.shadowColor || '#000' ctx.shadowOffsetX = item.shadowOffsetX || 0; ctx.shadowOffsetY = item.shadowOffsetY || 0; ctx.fillStyle = item.fillStyle || '#fff' const fontWidth = ctx.measureText(item.content).width / 2; //获取文本宽度 let rotate = item.rotate || 0 item.x = item.x || 0 item.y = item.y || 0 if (item.isRepeat) { item.repeatWidth = item.repeatWidth || _this.canvasWidth item.repeatHeight = item.repeatHeight || _this.canvasHeight item.distanceX = item.distanceX || 60 item.distanceY = item.distanceY || 50 ctx.rotate(-rotate * Math.PI / 180) for (let i = item.x; i < item.repeatWidth; i += item.distanceX) { for (let j = item.y; j < item.repeatHeight; j += item.distanceY) { // 填充文字,x 间距, y 间距 console.log(item.x, item.y); ctx.fillText(item.content, i, j) } } ctx.rotate(rotate * Math.PI / 180); } else { ctx.rotate(-rotate * Math.PI / 180) ctx.fillText(item.content, item.x, item.y); ctx.rotate(rotate * Math.PI / 180); } }) imageArr.some(function(item, index) { uni.getImageInfo({ src: item.path, success: function(reimg) { let rotate = item.rotate || 0 item.x = item.x || 0 item.y = item.y || 0 item.width = item.width || reimg.width / _this.pixelRatio item.height = item.height || reimg.height / _this.pixelRatio if (item.isRepeat) { item.repeatWidth = item.repeatWidth || _this.canvasWidth item.repeatHeight = item.repeatHeight || _this.canvasHeight item.distanceX = item.distanceX || 60 item.distanceY = item.distanceY || 50 ctx.rotate(-rotate * Math.PI / 180); for (let i = item.x; i < item.repeatWidth; i += item.distanceX) { for (let j = item.y; j < item.repeatHeight; j += item.distanceY) { // 填充文字,x 间距, y 间距 console.log(item.x, item.y); ctx.drawImage(reimg.path, i, j, item.width, item.height) } } ctx.rotate(rotate * Math.PI / 180); } else { ctx.rotate(-rotate * Math.PI / 180) ctx.drawImage(reimg.path, item.x, item.y, item.width, item.height) ctx.rotate(rotate * Math.PI / 180) } if (imageArr.length == index + 1) { _this.otherGenerateBase64(options, ctx); } } }) }) }, otherGenerateBase64(options, ctx) { let _this = this; ctx.draw(true, function(ret) { uni.canvasToTempFilePath({ canvasId: 'myCanvas', // canvas id quality: options.quality || 1, complete(res) { const savedFilePath = res.tempFilePath //相对路径 const path = plus.io.convertLocalFileSystemURL(savedFilePath) //绝对路径 const fileReader = new plus.io.FileReader() fileReader.readAsDataURL(path) fileReader.onloadend = (res) => { //读取文件成功完成的回调函数 _this.$emit("pBackImage", res.target.result); } } }) }) }, h5CanvasDraw(options) { let _this = this; const img = new Image() img.src = options.url // img.crossOrigin = 'anonymous' img.onload = function() { const canvas = document.createElement('canvas') let size = options.maxSize || 0; if (options.maxSize) { if (img.width > img.height) { if (img.width < size) { size = img.width; } _this.canvasWidth = size; _this.canvasHeight = img.height / (img.width / size); } else { if (img.height < size) { size = img.height; } _this.canvasHeight = size; _this.canvasWidth = img.width / (img.height / size); } } else { _this.canvasWidth = img.width _this.canvasHeight = img.height } canvas.width = _this.canvasWidth canvas.height = _this.canvasHeight const ctx = canvas.getContext('2d') ctx.drawImage(img, 0, 0) ctx.textAlign = options.textAlign || 'top' ctx.textBaseline = options.textBaseline || 'top' let imageArr = []; let textArr = []; options.watermark.some(function(item, index) { if (item.type == 'image') { imageArr.push(item); } if (item.type == 'text') { textArr.push(item); } }) textArr.some(function(item, index) { ctx.font = (item.font || '16px') + ' Arial' ctx.shadowColor = item.shadowColor || '#000' ctx.shadowOffsetX = item.shadowOffsetX || 0; ctx.shadowOffsetY = item.shadowOffsetY || 0; ctx.fillStyle = item.fillStyle || '#fff' const fontWidth = ctx.measureText(item.content).width / 2; //获取文本宽度 let rotate = item.rotate || 0 item.x = item.x || 0 item.y = item.y || 0 if (item.isRepeat) { item.repeatWidth = item.repeatWidth || _this.canvasWidth item.repeatHeight = item.repeatHeight || _this.canvasHeight item.distanceX = item.distanceX || 60 item.distanceY = item.distanceY || 50 ctx.rotate(-rotate * Math.PI / 180) for (let i = item.x; i < item.repeatWidth; i += item.distanceX) { for (let j = item.y; j < item.repeatHeight; j += item.distanceY) { // 填充文字,x 间距, y 间距 console.log(item.x, item.y); ctx.fillText(item.content, i, j) } } ctx.rotate(rotate * Math.PI / 180); } else { ctx.rotate(-rotate * Math.PI / 180) ctx.fillText(item.content, item.x, item.y); ctx.rotate(rotate * Math.PI / 180); } }) imageArr.some(function(item, index) { const reimg = new Image() reimg.src = item.path reimg.crossOrigin = 'anonymous' reimg.setAttribute('crossOrigin', 'anonymous'); getImageInfo reimg.onload = function() { let rotate = item.rotate || 0 item.x = item.x || 0 item.y = item.y || 0 item.width = item.width || reimg.width item.height = item.height || reimg.height if (item.isRepeat) { item.repeatWidth = item.repeatWidth || _this.canvasWidth item.repeatHeight = item.repeatHeight || _this.canvasHeight item.distanceX = item.distanceX || 60 item.distanceY = item.distanceY || 50 ctx.rotate(-rotate * Math.PI / 180); for (let i = item.x; i < item.repeatWidth; i += item.distanceX) { for (let j = item.y; j < item.repeatHeight; j += item.distanceY) { // 填充文字,x 间距, y 间距 console.log(item.x, item.y); ctx.drawImage(reimg, i, j, item.width, item.height) } } ctx.rotate(rotate * Math.PI / 180); } else { ctx.rotate(-rotate * Math.PI / 180) ctx.drawImage(reimg, item.x, item.y, item.width, item.height) ctx.rotate(rotate * Math.PI / 180) } if (imageArr.length == index + 1) { const base64Url = canvas.toDataURL() _this.$emit("pBackImage", base64Url); } } }) } } } } </script> <style lang="scss" scoped> .content { width: 0; height: 0; overflow: hidden; } </style>