render.js 5.53 KB
// #ifdef APP-VUE 
// import { Signature } from '@signature'
import {
	Signature
} from './signature.js'
import {
	isTransparent
} from './utils'
export default {
	data() {
		return {
			canvasid: null,
			signature: null,
			observer: null,
			options: {},
			saveCount: 0,
		}
	},
	mounted() {
		this.$nextTick(this.init)
	},
	methods: {
		init() {
			const el = this.$refs.limeSignature || this.$ownerInstance.$el;
			this.canvas = document.createElement('canvas')
			this.canvas.style = 'width: 100%; height: 100%;'
			el.appendChild(this.canvas)
			this.signature = new Signature({
				el: this.canvas
			})
			this.signature.pen.setOption(this.options)
			const width = this.signature.canvas.get('width')
			const height = this.signature.canvas.get('height')

			this.emit({
				changeSize: {
					width,
					height
				}
			})
		},
		redo(v) {
			if (v && this.signature) {
				this.signature.redo()
			}
		},
		undo(v) {
			if (v && this.signature) {
				this.signature.undo()
			}
		},
		clear(v) {
			if (v && this.signature) {
				this.signature.clear()
			}
		},
		destroy() {
			if (this.canvas) {
				this.canvas.remove()
			}
		},
		mask(param={}) {
			if (this.signature) {
				let {destWidth=0, destHeight=0} = JSON.parse(param)
				let canvas = document.createElement('canvas')
				const ctx = canvas.getContext('2d');
				const pixelRatio = this.signature.canvas.get('pixelRatio')
				let width = this.signature.canvas.get('width')
				let height = this.signature.canvas.get('height')
				let context = this.signature.canvas.get('context')
				canvas.width = width * pixelRatio
				canvas.height = height * pixelRatio

				const imageData = context.getImageData(0, 0, width * pixelRatio, height * pixelRatio);
				for (let i = 0; i < imageData.data.length; i += 4) {
					// 判断当前像素是否透明
					const isTransparent = imageData.data[i + 3] === 0;
				
					if (isTransparent) {
						// 将透明像素设置为黑色背景
						imageData.data[i] = 0;
						imageData.data[i + 1] = 0;
						imageData.data[i + 2] = 0;
					} else {
						// 将非透明像素设置为白色内容
						imageData.data[i] = 255;
						imageData.data[i + 1] = 255;
						imageData.data[i + 2] = 255;
					}
				}
				ctx.putImageData(imageData, 0, 0);
				if(destWidth&&destHeight){
					const _canvas = document.createElement('canvas')
					_canvas.width = destWidth
					_canvas.height = destHeight
					const _context = _canvas.getContext('2d')
					_context.drawImage(canvas, 0, 0, destWidth, destHeight)
					canvas.remove()
					canvas = _canvas	
				}
				this.emit({
					save: canvas.toDataURL()
				})
				canvas.remove()
			}

		},
		save(param) {
			let {
				fileType = 'png', 
				quality = 1, 
				n,
				destWidth = 0,
				destHeight = 0,
			} = JSON.parse(param)
			const type = `image/${fileType}`.replace(/jpg/, 'jpeg');
			if (n !== this.saveCount) {
				this.saveCount = n;
				const {
					backgroundColor,
					backgroundImage,
					landscape,
					boundingBox
				} = this.options
				const flag = landscape || backgroundColor || boundingBox||destWidth&&destHeight
				const image = this.signature.canvas.get('el').toDataURL(!flag && type, !flag && quality)
				if (flag) {
					let canvas = document.createElement('canvas')
					const pixelRatio = this.signature.canvas.get('pixelRatio')
					let width = this.signature.canvas.get('width')
					let height = this.signature.canvas.get('height')
					let x = 0
					let y = 0

					const next = () => {
						const size = [width, height]
						if (landscape) {
							size.reverse()
						}
						canvas.width =  size[0] * pixelRatio
						canvas.height = size[1] * pixelRatio
						const param = [x, y, width, height, 0, 0, width, height].map(item => item * pixelRatio)
						const context = canvas.getContext('2d')
						if (landscape) {
							context.translate(0, width * pixelRatio)
							context.rotate(-Math.PI / 2)
						}
						if (backgroundColor && !isTransparent(backgroundColor)) {
							context.fillStyle = backgroundColor
							context.fillRect(0, 0, width * pixelRatio, height * pixelRatio)
						}
						const drawImage = () => {
							// param
							context.drawImage(this.signature.canvas.get('el'), ...param)
							if(destWidth&&destHeight){
								const _canvas = document.createElement('canvas')
								_canvas.width = destWidth
								_canvas.height = destHeight
								const _context = _canvas.getContext('2d')
								_context.drawImage(canvas, 0, 0, destWidth, destHeight)
								canvas.remove()
								canvas = _canvas	
							}
							this.emit({
								save: canvas.toDataURL(type, quality)
							})
							canvas.remove()
						}
						if (backgroundImage) {
							const img = new Image();
							img.onload = () => {
								context.drawImage(img, ...param)
								drawImage()
							}
							img.src = backgroundImage
						}
						if (!backgroundImage) {
							drawImage()
						}
					}
					if (boundingBox) {
						const res = this.signature.getContentBoundingBox()
						width = res.width
						height = res.height
						x = res.startX
						y = res.startY
						next()
					} else {
						next()
					}

				} else {
					this.emit({
						save: image
					})
				}
			}
		},
		isEmpty(v) {
			if (v && this.signature) {
				const isEmpty = this.signature.isEmpty()
				this.emit({
					isEmpty
				})
			}
		},
		emit(event) {
			this.$ownerInstance.callMethod('onMessage', {
				detail: {
					data: [{
						event
					}]
				}
			})
		},
		update(v) {
			if (v) {
				if (this.signature) {
					this.options = v
					this.signature.pen.setOption(v)
				} else {
					this.options = v
				}
			}
		}
	}
}
// #endif