liang-z-screenshot
Version:
vue-web-screen-shot 修复 html2canvas 截图 图片空白
751 lines (750 loc) • 38.8 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
exports.__esModule = true;
var vue_1 = require("vue");
var DrawMasking_1 = require("@/module/split-methods/DrawMasking");
var html2canvas_1 = require("html2canvas");
var PlugInParameters_1 = require("@/module/main-entrance/PlugInParameters");
var FixedData_1 = require("@/module/common-methords/FixedData");
var ZoomCutOutBoxPosition_1 = require("@/module/common-methords/ZoomCutOutBoxPosition");
var SaveBorderArrInfo_1 = require("@/module/common-methords/SaveBorderArrInfo");
var DrawCutOutBox_1 = require("@/module/split-methods/DrawCutOutBox");
var InitData_1 = require("@/module/main-entrance/InitData");
var CalculateToolLocation_1 = require("@/module/split-methods/CalculateToolLocation");
var DrawRectangle_1 = require("@/module/split-methods/DrawRectangle");
var DrawCircle_1 = require("@/module/split-methods/DrawCircle");
var DrawLineArrow_1 = require("@/module/split-methods/DrawLineArrow");
var DrawPencil_1 = require("@/module/split-methods/DrawPencil");
var DrawText_1 = require("@/module/split-methods/DrawText");
var SaveCanvasToImage_1 = require("@/module/common-methords/SaveCanvasToImage");
var SaveCanvasToBase64_1 = require("@/module/common-methords/SaveCanvasToBase64");
var DrawMosaic_1 = require("@/module/split-methods/DrawMosaic");
var CalculateOptionIcoPosition_1 = require("@/module/split-methods/CalculateOptionIcoPosition");
var SetSelectedClassName_1 = require("@/module/common-methords/SetSelectedClassName");
var webrtc_adapter_1 = require("webrtc-adapter");
var BoundaryJudgment_1 = require("@/module/split-methods/BoundaryJudgment");
var EventMonitoring = /** @class */ (function () {
function EventMonitoring(props, context) {
var _this = this;
// 图形位置参数
this.drawGraphPosition = {
startX: 0,
startY: 0,
width: 0,
height: 0
};
// 临时图形位置参数
this.tempGraphPosition = {
startX: 0,
startY: 0,
width: 0,
height: 0
};
// 裁剪框边框节点坐标事件
this.cutOutBoxBorderArr = [];
// 裁剪框顶点边框直径大小
this.borderSize = 10;
// 当前操作的边框节点
this.borderOption = null;
// 点击裁剪框时的鼠标坐标
this.movePosition = {
moveStartX: 0,
moveStartY: 0
};
// 裁剪框修剪状态
this.draggingTrim = false;
// 裁剪框拖拽状态
this.dragging = false;
// 鼠标点击状态
this.clickFlag = false;
// 鼠标拖动状态
this.dragFlag = false;
// 单击截取屏启用状态
this.clickCutFullScreen = false;
// 全屏截取状态
this.getFullScreenStatus = false;
// 上一个裁剪框坐标信息
this.drawGraphPrevX = 0;
this.drawGraphPrevY = 0;
// 当前点击的工具栏条目
this.toolName = "";
this.fontSize = 17;
// 撤销点击次数
this.undoClickNum = 0;
// 最大可撤销次数
this.maxUndoNum = 15;
// 马赛克涂抹区域大小
this.degreeOfBlur = 5;
this.history = [];
// 文本输入框位置
this.textInputPosition = {
mouseX: 0,
mouseY: 0
};
// 开始捕捉屏幕
this.startCapture = function () { return __awaiter(_this, void 0, void 0, function () {
var captureStream, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
captureStream = null;
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, navigator.mediaDevices.getDisplayMedia()];
case 2:
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
// 捕获屏幕
captureStream = _a.sent();
// 将MediaStream输出至video标签
this.videoController.srcObject = captureStream;
return [3 /*break*/, 4];
case 3:
err_1 = _a.sent();
// 销毁组件
this.resetComponent();
throw "浏览器不支持webrtc或者用户未授权, 浏览器名称" +
webrtc_adapter_1["default"].browserDetails.browser +
",浏览器版本号" +
webrtc_adapter_1["default"].browserDetails.version +
err_1;
case 4: return [2 /*return*/, captureStream];
}
});
}); };
// 停止捕捉屏幕
this.stopCapture = function () {
var srcObject = _this.videoController.srcObject;
if (srcObject && "getTracks" in srcObject) {
var tracks = srcObject.getTracks();
tracks.forEach(function (track) { return track.stop(); });
_this.videoController.srcObject = null;
}
};
// 鼠标按下事件
this.mouseDownEvent = function (event) {
var _a, _b, _c;
// 当前操作的是撤销
if (_this.toolName == "undo")
return;
_this.dragging = true;
_this.clickFlag = true;
var mouseX = FixedData_1.nonNegativeData(event.offsetX);
var mouseY = FixedData_1.nonNegativeData(event.offsetY);
// 如果当前操作的是截图工具栏
if (_this.data.getToolClickStatus().value) {
// 记录当前鼠标开始坐标
_this.drawGraphPosition.startX = mouseX;
_this.drawGraphPosition.startY = mouseY;
}
// 当前操作的是画笔
if (_this.toolName == "brush" && _this.screenShortCanvas) {
// 初始化画笔
DrawPencil_1.initPencil(_this.screenShortCanvas, mouseX, mouseY);
}
// 当前操作的文本
if (_this.toolName == "text" && ((_a = _this.textInputController) === null || _a === void 0 ? void 0 : _a.value) && ((_b = _this.screenShortController) === null || _b === void 0 ? void 0 : _b.value) &&
_this.screenShortCanvas) {
// 修改鼠标样式
_this.screenShortController.value.style.cursor = "text";
// 显示文本输入区域
_this.data.setTextStatus(true);
// 判断输入框位置是否变化
if (_this.textInputPosition.mouseX != 0 &&
_this.textInputPosition.mouseY != 0 &&
_this.textInputPosition.mouseX != mouseX &&
_this.textInputPosition.mouseY != mouseY) {
DrawText_1.drawText((_c = _this.textInputController.value) === null || _c === void 0 ? void 0 : _c.innerText, _this.textInputPosition.mouseX, _this.textInputPosition.mouseY, _this.data.getSelectedColor().value, _this.fontSize, _this.screenShortCanvas);
// 清空文本输入区域的内容
_this.textInputController.value.innerHTML = "";
// 保存绘制记录
_this.addHistory();
}
// 计算文本框显示位置
var textMouseX = mouseX - 15;
var textMouseY = mouseY - 15;
// 修改文本区域位置
_this.textInputController.value.style.left = textMouseX + "px";
_this.textInputController.value.style.top = textMouseY + "px";
setTimeout(function () {
var _a;
// 获取焦点
if ((_a = _this.textInputController) === null || _a === void 0 ? void 0 : _a.value) {
_this.textInputController.value.focus();
// 记录当前输入框位置
_this.textInputPosition = { mouseX: mouseX, mouseY: mouseY };
}
});
}
// 如果操作的是裁剪框
if (_this.borderOption) {
// 设置为拖动状态
_this.draggingTrim = true;
// 记录移动时的起始点坐标
_this.movePosition.moveStartX = mouseX;
_this.movePosition.moveStartY = mouseY;
}
else {
// 保存当前裁剪框的坐标
_this.drawGraphPrevX = _this.drawGraphPosition.startX;
_this.drawGraphPrevY = _this.drawGraphPosition.startY;
// 绘制裁剪框,记录当前鼠标开始坐标
_this.drawGraphPosition.startX = mouseX;
_this.drawGraphPosition.startY = mouseY;
}
};
// 鼠标移动事件
this.mouseMoveEvent = function (event) {
if (_this.screenShortCanvas == null ||
_this.screenShortController.value == null ||
_this.toolName == "undo") {
return;
}
// 工具栏未选择且鼠标处于按下状态时
if (!_this.data.getToolClickStatus().value && _this.dragging) {
// 修改拖动状态为true;
_this.dragFlag = true;
// 隐藏截图工具栏
_this.data.setToolStatus(false);
}
_this.clickFlag = false;
// 获取当前绘制中的工具位置信息
var _a = _this.drawGraphPosition, startX = _a.startX, startY = _a.startY, width = _a.width, height = _a.height;
// 获取当前鼠标坐标
var currentX = FixedData_1.nonNegativeData(event.offsetX);
var currentY = FixedData_1.nonNegativeData(event.offsetY);
// 绘制中工具的临时宽高
var tempWidth = currentX - startX;
var tempHeight = currentY - startY;
// 工具栏绘制
if (_this.data.getToolClickStatus().value && _this.dragging) {
// 获取裁剪框位置信息
var cutBoxPosition = _this.data.getCutOutBoxPosition();
// 绘制中工具的起始x、y坐标不能小于裁剪框的起始坐标
// 绘制中工具的起始x、y坐标不能大于裁剪框的结束标作
// 当前鼠标的x坐标不能小于裁剪框起始x坐标,不能大于裁剪框的结束坐标
// 当前鼠标的y坐标不能小于裁剪框起始y坐标,不能大于裁剪框的结束坐标
if (!BoundaryJudgment_1.getDrawBoundaryStatus(startX, startY, cutBoxPosition) ||
!BoundaryJudgment_1.getDrawBoundaryStatus(currentX, currentY, cutBoxPosition))
return;
// 当前操作的不是马赛克则显示最后一次画布绘制时的状态
if (_this.toolName != "mosaicPen") {
_this.showLastHistory();
}
switch (_this.toolName) {
case "square":
DrawRectangle_1.drawRectangle(startX, startY, tempWidth, tempHeight, _this.data.getSelectedColor().value, _this.data.getPenSize().value, _this.screenShortCanvas, _this.screenShortController.value, _this.screenShortImageController);
break;
case "round":
DrawCircle_1.drawCircle(_this.screenShortCanvas, currentX, currentY, startX, startY, _this.data.getPenSize().value, _this.data.getSelectedColor().value);
break;
case "right-top":
DrawLineArrow_1.drawLineArrow(_this.screenShortCanvas, startX, startY, currentX, currentY, 30, 10, _this.data.getPenSize().value, _this.data.getSelectedColor().value);
break;
case "brush":
// 画笔绘制
DrawPencil_1.drawPencil(_this.screenShortCanvas, currentX, currentY, _this.data.getPenSize().value, _this.data.getSelectedColor().value);
break;
case "mosaicPen":
// 绘制马赛克,为了确保鼠标位置在绘制区域中间,所以对x、y坐标进行-10处理
DrawMosaic_1.drawMosaic(currentX - 10, currentY - 10, _this.data.getPenSize().value, _this.degreeOfBlur, _this.screenShortCanvas);
break;
default:
break;
}
return;
}
// 执行裁剪框操作函数
_this.operatingCutOutBox(currentX, currentY, startX, startY, width, height, _this.screenShortCanvas);
// 如果鼠标未点击或者当前操作的是裁剪框都return
if (!_this.dragging || _this.draggingTrim)
return;
// 绘制裁剪框
_this.tempGraphPosition = DrawCutOutBox_1.drawCutOutBox(startX, startY, tempWidth, tempHeight, _this.screenShortCanvas, _this.borderSize, _this.screenShortController.value, _this.screenShortImageController);
};
// 鼠标抬起事件
this.mouseUpEvent = function () {
// 当前操作的是撤销
if (_this.toolName == "undo")
return;
// 绘制结束
_this.dragging = false;
_this.draggingTrim = false;
if (_this.screenShortController.value == null ||
_this.screenShortCanvas == null ||
_this.screenShortImageController == null) {
return;
}
// 工具栏未点击且鼠标未拖动且单击截屏状态为false则复原裁剪框位置
if (!_this.data.getToolClickStatus().value &&
!_this.dragFlag &&
!_this.clickCutFullScreen) {
// 复原裁剪框的坐标
_this.drawGraphPosition.startX = _this.drawGraphPrevX;
_this.drawGraphPosition.startY = _this.drawGraphPrevY;
return;
}
// 调用者尚未拖拽生成选区
// 鼠标尚未拖动
// 单击截取屏幕状态为true
// 则截取整个屏幕
var cutBoxPosition = _this.data.getCutOutBoxPosition();
if (cutBoxPosition.width === 0 &&
cutBoxPosition.height === 0 &&
cutBoxPosition.startX === 0 &&
cutBoxPosition.startY === 0 &&
!_this.dragFlag &&
_this.clickCutFullScreen) {
_this.getFullScreenStatus = true;
// 设置裁剪框位置为全屏
_this.tempGraphPosition = DrawCutOutBox_1.drawCutOutBox(0, 0, _this.screenShortController.value.width - _this.borderSize / 2, _this.screenShortController.value.height - _this.borderSize / 2, _this.screenShortCanvas, _this.borderSize, _this.screenShortController.value, _this.screenShortImageController);
}
if (_this.data.getToolClickStatus().value) {
// 保存绘制记录
_this.addHistory();
return;
}
// 保存绘制后的图形位置信息
_this.drawGraphPosition = _this.tempGraphPosition;
// 如果工具栏未点击则保存裁剪框位置
if (!_this.data.getToolClickStatus().value) {
var _a = _this.drawGraphPosition, startX = _a.startX, startY = _a.startY, width = _a.width, height = _a.height;
_this.data.setCutOutBoxPosition(startX, startY, width, height);
}
// 保存边框节点信息
_this.cutOutBoxBorderArr = SaveBorderArrInfo_1.saveBorderArrInfo(_this.borderSize, _this.drawGraphPosition);
if (_this.screenShortController.value != null) {
// 修改鼠标状态为拖动
_this.screenShortController.value.style.cursor = "move";
// 复原拖动状态
_this.dragFlag = false;
// 显示截图工具栏
_this.data.setToolStatus(true);
vue_1.nextTick().then(function () {
var _a;
if (_this.toolController.value != null) {
// 计算截图工具栏位置
var toolLocation = CalculateToolLocation_1.calculateToolLocation(_this.drawGraphPosition, (_a = _this.toolController.value) === null || _a === void 0 ? void 0 : _a.offsetWidth);
// 当前截取的是全屏,则修改工具栏的位置到截图容器最底部,防止超出
if (_this.getFullScreenStatus) {
toolLocation.mouseY -= 64;
}
// 设置截图工具栏位置
_this.data.setToolInfo(toolLocation.mouseX, toolLocation.mouseY);
// 状态重置
_this.getFullScreenStatus = false;
}
});
}
};
/**
* 裁剪框工具栏点击事件
* @param toolName
* @param index
* @param mouseEvent
*/
this.toolClickEvent = function (toolName, index, mouseEvent) {
var _a;
// 更新当前点击的工具栏条目
_this.toolName = toolName;
var screenShortController = _this.data.getScreenShortController();
var ScreenShortImageController = _this.data.getScreenShortImageController();
if (screenShortController.value == null ||
ScreenShortImageController == null)
return;
// 获取canvas容器
var screenShortCanvas = screenShortController.value.getContext("2d");
// 工具栏尚未点击,当前属于首次点击,重新绘制一个无像素点的裁剪框
if (!_this.data.getToolClickStatus().value) {
// 获取裁剪框位置信息
var cutBoxPosition = _this.data.getCutOutBoxPosition();
// 开始绘制无像素点裁剪框
DrawCutOutBox_1.drawCutOutBox(cutBoxPosition.startX, cutBoxPosition.startY, cutBoxPosition.width, cutBoxPosition.height, screenShortCanvas, _this.borderSize, screenShortController.value, ScreenShortImageController, false);
}
_this.data.setToolName(toolName);
// 为当前点击项添加选中时的class名
SetSelectedClassName_1.setSelectedClassName(mouseEvent, index, false);
if (toolName != "text") {
// 显示画笔选择工具栏
_this.data.setOptionStatus(true);
// 设置画笔选择工具栏三角形角标位置
_this.data.setOptionIcoPosition(CalculateOptionIcoPosition_1.calculateOptionIcoPosition(index));
}
else {
// 隐藏画笔工具栏
_this.data.setOptionStatus(false);
}
// 清空文本输入区域的内容并隐藏文本输入框
if (((_a = _this.textInputController) === null || _a === void 0 ? void 0 : _a.value) != null && _this.data.getTextStatus()) {
_this.textInputController.value.innerHTML = "";
_this.data.setTextStatus(false);
}
// 初始化点击状态
_this.dragging = false;
_this.draggingTrim = false;
// 保存图片
if (toolName == "save") {
_this.getCanvasImgData(true);
}
// 销毁组件
if (toolName == "close") {
_this.resetComponent();
}
// 确认截图
if (toolName == "confirm" && _this.screenShortCanvas && _this.emit) {
var base64 = _this.getCanvasImgData(false);
_this.emit("get-image-data", base64);
}
// 撤销
if (toolName == "undo") {
// 隐藏画笔选项工具栏
_this.data.setOptionStatus(false);
_this.takeOutHistory();
}
// 设置裁剪框工具栏为点击状态
_this.data.setToolClickStatus(true);
};
/**
* 重置组件
*/
this.resetComponent = function () {
if (_this.emit) {
// 隐藏截图工具栏
_this.data.setToolStatus(false);
// 初始化响应式变量
_this.data.setInitStatus(true);
// 销毁组件
_this.emit("destroy-component", false);
return;
}
throw "组件重置失败";
};
/**
* 将指定区域的canvas转为图片
* @private
*/
this.getCanvasImgData = function (isSave) {
// 获取裁剪区域位置信息
var _a = _this.data.getCutOutBoxPosition(), startX = _a.startX, startY = _a.startY, width = _a.width, height = _a.height;
var base64 = "";
// 保存图片,需要减去八个点的大小
if (_this.screenShortCanvas) {
if (isSave) {
// 将canvas转为图片
SaveCanvasToImage_1.saveCanvasToImage(_this.screenShortCanvas, startX, startY, width, height);
}
else {
// 将canvas转为base64
base64 = SaveCanvasToBase64_1.saveCanvasToBase64(_this.screenShortCanvas, startX, startY, width, height);
}
}
// 重置组件
_this.resetComponent();
return base64;
};
// 实例化响应式data
this.data = new InitData_1["default"]();
// 获取截图区域canvas容器
this.screenShortController = this.data.getScreenShortController();
this.toolController = this.data.getToolController();
this.textInputController = this.data.getTextInputController();
this.optionController = this.data.getOptionController();
this.optionIcoController = this.data.getOptionIcoController();
this.videoController = document.createElement("video");
this.videoController.autoplay = true;
this.screenShortImageController = document.createElement("canvas");
// 设置实例与属性
this.data.setPropsData(context.emit);
vue_1.onMounted(function () {
var _a;
_this.emit = _this.data.getEmit();
var plugInParameters = new PlugInParameters_1["default"]();
// 单击截屏启用状态
_this.clickCutFullScreen = plugInParameters.getClickCutFullScreenStatus();
// 设置需要隐藏的工具栏图标
_this.data.setHiddenToolIco(plugInParameters.getHiddenToolIco());
// 设置截图区域canvas宽高
_this.data.setScreenShortInfo(window.innerWidth, window.innerHeight);
if (_this.screenShortImageController == null)
return;
// 设置截图图片存放容器宽高
_this.screenShortImageController.width = window.innerWidth;
_this.screenShortImageController.height = window.innerHeight;
if (plugInParameters.getWebRtcStatus()) {
// 设置为屏幕宽高
_this.data.setScreenShortInfo(window.screen.width, window.screen.height);
// 设置为屏幕宽高
_this.screenShortImageController.width = window.screen.width;
_this.screenShortImageController.height = window.screen.height;
}
// 获取截图区域画canvas容器画布
var context = (_a = _this.screenShortController.value) === null || _a === void 0 ? void 0 : _a.getContext("2d");
if (context == null)
return;
if (!plugInParameters.getWebRtcStatus()) {
console.log("####################### test patch package 截屏 #######################");
console.log("####################### html2canvas截屏 #######################");
// html2canvas截屏
html2canvas_1["default"](document.body, { useCORS: true, allowTaint: true }).then(function (canvas) {
var _a, _b, _c;
// 装载截图的dom为null则退出
if (_this.screenShortController.value == null)
return;
// 调整截屏容器层级
_this.screenShortController.value.style.zIndex =
plugInParameters.getLevel() + "";
// 调整截图工具栏层级
if (_this.toolController.value == null)
return;
_this.toolController.value.style.zIndex = "" + (plugInParameters.getLevel() +
1);
// 存放html2canvas截取的内容
_this.screenShortImageController = canvas;
// 存储屏幕截图
_this.data.setScreenShortImageController(canvas);
// 赋值截图区域canvas画布
_this.screenShortCanvas = context;
// 绘制蒙层
DrawMasking_1.drawMasking(context);
// 添加监听
(_a = _this.screenShortController.value) === null || _a === void 0 ? void 0 : _a.addEventListener("mousedown", _this.mouseDownEvent);
(_b = _this.screenShortController.value) === null || _b === void 0 ? void 0 : _b.addEventListener("mousemove", _this.mouseMoveEvent);
(_c = _this.screenShortController.value) === null || _c === void 0 ? void 0 : _c.addEventListener("mouseup", _this.mouseUpEvent);
});
return;
}
// 开始捕捉屏幕
_this.startCapture().then(function () {
setTimeout(function () {
var _a, _b, _c;
// 装载截图的dom为null则退出
if (_this.screenShortController.value == null)
return;
if (_this.screenShortImageController == null)
return;
var imageContext = _this.screenShortImageController.getContext("2d");
if (imageContext == null)
return;
// 将获取到的屏幕截图绘制到图片容器里
imageContext.drawImage(_this.videoController, 0, 0, _this.screenShortImageController.width, _this.screenShortImageController.height);
// 存储屏幕截图
_this.data.setScreenShortImageController(_this.screenShortImageController);
// 赋值截图区域canvas画布
_this.screenShortCanvas = context;
// 绘制蒙层
DrawMasking_1.drawMasking(context);
// 添加监听
(_a = _this.screenShortController.value) === null || _a === void 0 ? void 0 : _a.addEventListener("mousedown", _this.mouseDownEvent);
(_b = _this.screenShortController.value) === null || _b === void 0 ? void 0 : _b.addEventListener("mousemove", _this.mouseMoveEvent);
(_c = _this.screenShortController.value) === null || _c === void 0 ? void 0 : _c.addEventListener("mouseup", _this.mouseUpEvent);
// 停止捕捉屏幕
_this.stopCapture();
// 调整截屏容器层级
_this.screenShortController.value.style.zIndex =
plugInParameters.getLevel() + "";
// 调整截图工具栏层级
if (_this.toolController.value == null)
return;
_this.toolController.value.style.zIndex = "" + (plugInParameters.getLevel() +
1);
}, 500);
});
});
vue_1.onUnmounted(function () {
// 初始化initData中的数据
_this.data.setInitStatus(true);
});
}
/**
* 操作裁剪框
* @param currentX 裁剪框当前x轴坐标
* @param currentY 裁剪框当前y轴坐标
* @param startX 鼠标x轴坐标
* @param startY 鼠标y轴坐标
* @param width 裁剪框宽度
* @param height 裁剪框高度
* @param context 需要进行绘制的canvas画布
* @private
*/
EventMonitoring.prototype.operatingCutOutBox = function (currentX, currentY, startX, startY, width, height, context) {
// canvas元素不存在
if (this.screenShortController.value == null) {
return;
}
// 获取鼠标按下时的坐标
var _a = this.movePosition, moveStartX = _a.moveStartX, moveStartY = _a.moveStartY;
// 裁剪框边框节点事件存在且裁剪框未进行操作,则对鼠标样式进行修改
if (this.cutOutBoxBorderArr.length > 0 && !this.draggingTrim) {
// 标识鼠标是否在裁剪框内
var flag = false;
// 判断鼠标位置
context.beginPath();
for (var i = 0; i < this.cutOutBoxBorderArr.length; i++) {
context.rect(this.cutOutBoxBorderArr[i].x, this.cutOutBoxBorderArr[i].y, this.cutOutBoxBorderArr[i].width, this.cutOutBoxBorderArr[i].height);
// 当前坐标点处于8个可操作点上,修改鼠标指针样式
if (context.isPointInPath(currentX, currentY)) {
switch (this.cutOutBoxBorderArr[i].index) {
case 1:
if (this.data.getToolClickStatus().value) {
this.screenShortController.value.style.cursor = "crosshair";
}
else {
this.screenShortController.value.style.cursor = "move";
}
break;
case 2:
// 工具栏被点击则不改变指针样式
if (this.data.getToolClickStatus().value)
break;
this.screenShortController.value.style.cursor = "ns-resize";
break;
case 3:
// 工具栏被点击则不改变指针样式
if (this.data.getToolClickStatus().value)
break;
this.screenShortController.value.style.cursor = "ew-resize";
break;
case 4:
// 工具栏被点击则不改变指针样式
if (this.data.getToolClickStatus().value)
break;
this.screenShortController.value.style.cursor = "nwse-resize";
break;
case 5:
// 工具栏被点击则不改变指针样式
if (this.data.getToolClickStatus().value)
break;
this.screenShortController.value.style.cursor = "nesw-resize";
break;
default:
break;
}
this.borderOption = this.cutOutBoxBorderArr[i].option;
flag = true;
break;
}
}
context.closePath();
if (!flag) {
// 鼠标移出裁剪框重置鼠标样式
this.screenShortController.value.style.cursor = "default";
// 重置当前操作的边框节点为null
this.borderOption = null;
}
}
// 裁剪框正在被操作
if (this.draggingTrim) {
// 当前操作节点为1时则为移动裁剪框
if (this.borderOption === 1) {
// 计算要移动的x轴坐标
var x = FixedData_1.fixedData(currentX - (moveStartX - startX), width, this.screenShortController.value.width);
// 计算要移动的y轴坐标
var y = FixedData_1.fixedData(currentY - (moveStartY - startY), height, this.screenShortController.value.height);
// 重新绘制裁剪框
this.tempGraphPosition = DrawCutOutBox_1.drawCutOutBox(x, y, width, height, context, this.borderSize, this.screenShortController.value, this.screenShortImageController);
}
else {
// 裁剪框其他8个点的拖拽事件
var _b = ZoomCutOutBoxPosition_1.zoomCutOutBoxPosition(currentX, currentY, startX, startY, width, height, this.borderOption), tempStartX = _b.tempStartX, tempStartY = _b.tempStartY, tempWidth = _b.tempWidth, tempHeight = _b.tempHeight;
// 绘制裁剪框
this.tempGraphPosition = DrawCutOutBox_1.drawCutOutBox(tempStartX, tempStartY, tempWidth, tempHeight, context, this.borderSize, this.screenShortController.value, this.screenShortImageController);
}
}
};
/**
* 保存当前画布状态
* @private
*/
EventMonitoring.prototype.addHistory = function () {
if (this.screenShortCanvas != null &&
this.screenShortController.value != null) {
// 获取canvas画布与容器
var context_1 = this.screenShortCanvas;
var controller = this.screenShortController.value;
if (this.history.length > this.maxUndoNum) {
// 删除最早的一条画布记录
this.history.shift();
}
// 保存当前画布状态
this.history.push({
data: context_1.getImageData(0, 0, controller.width, controller.height)
});
// 启用撤销按钮
this.data.setUndoStatus(true);
}
};
/**
* 显示最新的画布状态
* @private
*/
EventMonitoring.prototype.showLastHistory = function () {
if (this.screenShortCanvas != null) {
var context_2 = this.screenShortCanvas;
if (this.history.length <= 0) {
this.addHistory();
}
context_2.putImageData(this.history[this.history.length - 1]["data"], 0, 0);
}
};
/**
* 取出一条历史记录
*/
EventMonitoring.prototype.takeOutHistory = function () {
var lastImageData = this.history.pop();
if (this.screenShortCanvas != null && lastImageData) {
var context_3 = this.screenShortCanvas;
if (this.undoClickNum == 0 && this.history.length > 0) {
// 首次取出需要取两条历史记录
var firstPopImageData = this.history.pop();
context_3.putImageData(firstPopImageData["data"], 0, 0);
}
else {
context_3.putImageData(lastImageData["data"], 0, 0);
}
}
this.undoClickNum++;
// 历史记录已取完,禁用撤回按钮点击
if (this.history.length <= 0) {
this.undoClickNum = 0;
this.data.setUndoStatus(false);
}
};
return EventMonitoring;
}());
exports["default"] = EventMonitoring;