You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
5.5 KiB
228 lines
5.5 KiB
// #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
|