|
|
|
|
<template>
|
|
|
|
|
<div class="thumb-example">
|
|
|
|
|
<div class="radioBox" v-if="roleUser == 8 || roleUser == 0">
|
|
|
|
|
{{ radioPx }} <span v-if="fileSize">({{ fileSize }})</span>
|
|
|
|
|
<span v-if="protocolInfo == '65280'"> 国网I1 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65296'"> 陕西 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65281'"> 安徽 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65282'"> 江苏</span>
|
|
|
|
|
<span v-if="protocolInfo == '65283'"> 湖南 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65284'"> 浙江 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65285'"> 河南全景</span>
|
|
|
|
|
<span v-if="protocolInfo == '65286'"> 河南郑州 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65290'"> 河南统一视频v2020 </span>
|
|
|
|
|
<span v-if="protocolInfo == '65298'"> 宁夏 </span>
|
|
|
|
|
<span v-if="protocolInfo == '2'"> 南网 </span>
|
|
|
|
|
<span>{{ protocolInfo }}</span>
|
|
|
|
|
<!-- <span>(共{{ terminalPhoto.length }}张)</span> -->
|
|
|
|
|
</div>
|
|
|
|
|
<div class="topPic">
|
|
|
|
|
<div
|
|
|
|
|
class="bigPic"
|
|
|
|
|
v-if="currentPicPath.indexOf('nopic') !== -1 && currentPicPath"
|
|
|
|
|
>
|
|
|
|
|
<el-image :src="currentPicPath"></el-image>
|
|
|
|
|
</div>
|
|
|
|
|
<div
|
|
|
|
|
class="bigPic"
|
|
|
|
|
v-else-if="currentPicPath && mediaType == 0"
|
|
|
|
|
v-loading="picLoading"
|
|
|
|
|
>
|
|
|
|
|
<!-- :preview-src-list="srcList" @click="handleBigPicbox(currentPicPath)" -->
|
|
|
|
|
<el-image
|
|
|
|
|
:src="currentPicPath + '!1366x768'"
|
|
|
|
|
@load="loadImage"
|
|
|
|
|
@error="setDefaultImage"
|
|
|
|
|
ref="picJpg"
|
|
|
|
|
id="alarmPic"
|
|
|
|
|
width="100%"
|
|
|
|
|
height="100%"
|
|
|
|
|
:preview-src-list="srcList"
|
|
|
|
|
>
|
|
|
|
|
<template slot="error">
|
|
|
|
|
<img src="../../../assets/img/nodatapic2.jpg" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-image>
|
|
|
|
|
<canvas id="myCanvas" class="myCanvas" ref="myCanvas"></canvas>
|
|
|
|
|
<canvas id="alarmCanvas" class="alarmCanvas" ref="alarmCanvas"></canvas>
|
|
|
|
|
<!-- <img :src="currentPicPath + '!1366x768'" @load="loadImage" /> -->
|
|
|
|
|
</div>
|
|
|
|
|
<div class="bigPic" v-else-if="currentPicPath && mediaType == 1">
|
|
|
|
|
<video
|
|
|
|
|
width="100%"
|
|
|
|
|
height="100%"
|
|
|
|
|
:src="currentPicPath"
|
|
|
|
|
controls="controls"
|
|
|
|
|
autoplay
|
|
|
|
|
></video>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="arrow leftArrow" @click="leftClick" v-if="activeSmall > 0">
|
|
|
|
|
<i class="el-icon-arrow-left"></i>
|
|
|
|
|
</div>
|
|
|
|
|
<el-button
|
|
|
|
|
v-if="mediaType !== 1"
|
|
|
|
|
class="downBtn"
|
|
|
|
|
@click.stop="downLoadPic(currentPicPath, currentPicPath)"
|
|
|
|
|
>下载图片</el-button
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
class="arrow rightArrow"
|
|
|
|
|
@click="rightClick"
|
|
|
|
|
v-if="activeSmall !== terminalPhoto.length - 1"
|
|
|
|
|
>
|
|
|
|
|
<i class="el-icon-arrow-right"></i>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<!-- -->
|
|
|
|
|
<div class="bottomPic">
|
|
|
|
|
<div class="scrollPicContain">
|
|
|
|
|
<div
|
|
|
|
|
class="el-car-item"
|
|
|
|
|
ref="scrollBox"
|
|
|
|
|
v-on:wheel="handleScroll"
|
|
|
|
|
:class="terminalPhoto.length < photoNum ? 'littlePic' : ''"
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
class="smallPic"
|
|
|
|
|
v-for="(item, index2) in terminalPhoto"
|
|
|
|
|
:key="index2"
|
|
|
|
|
@click="changeBigPic(item, index2)"
|
|
|
|
|
:class="`${activeSmall === index2 ? 'borderActive ' : ''}${
|
|
|
|
|
photoNum === 10 ? 'moreSmallPic' : ''
|
|
|
|
|
}`"
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
class="picBox"
|
|
|
|
|
v-if="
|
|
|
|
|
item.path.indexOf('nopic') == -1 &&
|
|
|
|
|
item.path.indexOf('videos') == -1
|
|
|
|
|
"
|
|
|
|
|
>
|
|
|
|
|
<!-- <el-image v-lazy="item.path + '!260x160'"></el-image> -->
|
|
|
|
|
<img v-lazy="item.path + '!260x160'" />
|
|
|
|
|
<!-- <img :src="item.path + '!260x160'" />-->
|
|
|
|
|
<!-- :class="{ alarmSpan: item.isAlarm === 1 }" -->
|
|
|
|
|
<p class="timeInfo">
|
|
|
|
|
<el-tooltip
|
|
|
|
|
class="item"
|
|
|
|
|
effect="dark"
|
|
|
|
|
content="拍照时间"
|
|
|
|
|
placement="top-start"
|
|
|
|
|
>
|
|
|
|
|
<span>{{ $moment(item.photoTime).format("HH:mm:ss") }}</span>
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
|
|
|
|
|
(
|
|
|
|
|
<el-tooltip
|
|
|
|
|
class="item"
|
|
|
|
|
effect="dark"
|
|
|
|
|
content="图片上传时间"
|
|
|
|
|
placement="top-start"
|
|
|
|
|
>
|
|
|
|
|
<span> {{ $moment(item.recvTime).format("HH:mm:ss") }}</span>
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
)
|
|
|
|
|
<span
|
|
|
|
|
>--{{
|
|
|
|
|
item.alias !== null && item.alias !== ""
|
|
|
|
|
? item.alias
|
|
|
|
|
: item.channelName
|
|
|
|
|
}}</span
|
|
|
|
|
>
|
|
|
|
|
<span class="alarmSpan" v-if="item.isAlarm == 1">(已告警)</span>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="picBox" v-else-if="item.mediaType == 1">
|
|
|
|
|
<!-- <el-image :src="item.thumb + '!260x160'"></el-image> -->
|
|
|
|
|
<img v-lazy="item.thumb + '!260x160'" />
|
|
|
|
|
<p class="timeInfo">
|
|
|
|
|
<i class="el-icon-video-camera"></i>
|
|
|
|
|
<el-tooltip
|
|
|
|
|
class="item"
|
|
|
|
|
effect="dark"
|
|
|
|
|
content="拍照时间"
|
|
|
|
|
placement="top-start"
|
|
|
|
|
>
|
|
|
|
|
<span>{{ $moment(item.photoTime).format("HH:mm:ss") }}</span>
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
|
|
|
|
|
(
|
|
|
|
|
<el-tooltip
|
|
|
|
|
class="item"
|
|
|
|
|
effect="dark"
|
|
|
|
|
content="图片上传时间"
|
|
|
|
|
placement="top-start"
|
|
|
|
|
>
|
|
|
|
|
<span> {{ $moment(item.recvTime).format("HH:mm:ss") }}</span>
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
)
|
|
|
|
|
<span
|
|
|
|
|
>--{{
|
|
|
|
|
item.alias !== null && item.alias !== ""
|
|
|
|
|
? item.alias
|
|
|
|
|
: item.channelName
|
|
|
|
|
}}</span
|
|
|
|
|
>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="picBox" v-else>
|
|
|
|
|
<!-- <el-image :src="item.path"></el-image> -->
|
|
|
|
|
<img v-lazy="item.path" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="arrow leftArrow" @click.stop="smallLeftClick" ref="leftRef">
|
|
|
|
|
<i class="el-icon-arrow-left"></i>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="arrow rightArrow" ref="rightRef">
|
|
|
|
|
<i class="el-icon-arrow-right" @click.stop="smallRightClick"></i>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- 点击出现大图 -->
|
|
|
|
|
<!-- <div v-if="showBigpic" class="showPic" @click="closePic($event)">
|
|
|
|
|
<div class="picboxI">
|
|
|
|
|
<img
|
|
|
|
|
id="bigimg2"
|
|
|
|
|
ref="bigimgref"
|
|
|
|
|
class="maskPic img"
|
|
|
|
|
:src="bigImgPath"
|
|
|
|
|
width="100%"
|
|
|
|
|
height="100%"
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<canvas id="bigCanvas2" class="mybigCanvas" ref="myCanvasbig"></canvas>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="viewClose" @click="closePic($event)">
|
|
|
|
|
<i class="el-icon-close"></i>
|
|
|
|
|
</div>
|
|
|
|
|
</div> -->
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import defaultImage from "../../../assets/img/nodatapic2.jpg";
|
|
|
|
|
import { getCoordinate, updateMarkEnableStatus } from "@/utils/api/index";
|
|
|
|
|
export default {
|
|
|
|
|
components: {},
|
|
|
|
|
props: {
|
|
|
|
|
terminalPhoto: {
|
|
|
|
|
type: Array,
|
|
|
|
|
default: () => [],
|
|
|
|
|
},
|
|
|
|
|
photoNum: {
|
|
|
|
|
type: Number,
|
|
|
|
|
default: () => [],
|
|
|
|
|
},
|
|
|
|
|
protocolInfo: {
|
|
|
|
|
type: Number,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
picLoading: true,
|
|
|
|
|
currentPicPath: "", //大图
|
|
|
|
|
mediaType: "", //判断图片类型是视频还是图片
|
|
|
|
|
activeSmall: 0, //索引选中小图,
|
|
|
|
|
currentPage: 0,
|
|
|
|
|
srcList: [],
|
|
|
|
|
radioPx: "",
|
|
|
|
|
fileSize: "",
|
|
|
|
|
roleUser: "",
|
|
|
|
|
localPoints: [], //线缆坐标
|
|
|
|
|
flagLine: true, //线缆标识
|
|
|
|
|
canvas: null,
|
|
|
|
|
ctx: null,
|
|
|
|
|
imgpic: null,
|
|
|
|
|
color: "", //线颜色
|
|
|
|
|
borderwidth: "", //线宽
|
|
|
|
|
markEnable: "", //是否显示
|
|
|
|
|
recArrs: [],
|
|
|
|
|
picDataAlarm: [],
|
|
|
|
|
labelMarkArrs: [],
|
|
|
|
|
|
|
|
|
|
//大图
|
|
|
|
|
showBigpic: false,
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
mounted() {
|
|
|
|
|
////console.log(this.terminalPhoto);
|
|
|
|
|
this.changeBigPic(this.terminalPhoto[0], 0);
|
|
|
|
|
},
|
|
|
|
|
watch: {
|
|
|
|
|
terminalPhoto: {
|
|
|
|
|
handler(newVal, oldVal) {
|
|
|
|
|
this.terminalPhoto = newVal;
|
|
|
|
|
},
|
|
|
|
|
immediate: true,
|
|
|
|
|
deep: true, //deep,默认值是 false,代表是否深度监听。
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
computed: {},
|
|
|
|
|
created() {
|
|
|
|
|
this.roleUser = localStorage.getItem("role");
|
|
|
|
|
////console.log(this.roleUser);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
methods: {
|
|
|
|
|
//下载图片
|
|
|
|
|
async downLoadPic(path, name) {
|
|
|
|
|
const imgUrl = path;
|
|
|
|
|
const response = await fetch(imgUrl);
|
|
|
|
|
const blob = await response.blob();
|
|
|
|
|
// 创建下载链接
|
|
|
|
|
const url = window.URL.createObjectURL(blob);
|
|
|
|
|
const link = document.createElement("a");
|
|
|
|
|
link.href = url;
|
|
|
|
|
console.log(name);
|
|
|
|
|
link.download = name.split("/").pop();
|
|
|
|
|
|
|
|
|
|
document.body.appendChild(link);
|
|
|
|
|
link.click();
|
|
|
|
|
document.body.removeChild(link);
|
|
|
|
|
// 释放 Blob URL
|
|
|
|
|
window.URL.revokeObjectURL(url);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
//获取线缆绘制显示
|
|
|
|
|
getPointList(data) {
|
|
|
|
|
console.log("woshi 线缆绘制", data);
|
|
|
|
|
getCoordinate({
|
|
|
|
|
channelId: data.channelId,
|
|
|
|
|
needPic: "1",
|
|
|
|
|
termId: data.termId,
|
|
|
|
|
})
|
|
|
|
|
.then((res) => {
|
|
|
|
|
//console.log(res);
|
|
|
|
|
this.localPoints = res.data.list;
|
|
|
|
|
this.color = res.data.color;
|
|
|
|
|
this.borderwidth = res.data.boderWidth;
|
|
|
|
|
this.markEnable = res.data.markEnable;
|
|
|
|
|
if (this.markEnable === 1) {
|
|
|
|
|
this.drawline();
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => {});
|
|
|
|
|
},
|
|
|
|
|
//开启绘制线缆
|
|
|
|
|
openLine() {
|
|
|
|
|
this.flagLine = true;
|
|
|
|
|
|
|
|
|
|
//开启传1
|
|
|
|
|
updateMarkEnableStatus({
|
|
|
|
|
status: 1,
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
//console.log(res);
|
|
|
|
|
});
|
|
|
|
|
this.drawline();
|
|
|
|
|
},
|
|
|
|
|
//关闭绘制线缆
|
|
|
|
|
closeLine() {
|
|
|
|
|
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
|
|
|
this.flagLine = false;
|
|
|
|
|
|
|
|
|
|
//关闭传0
|
|
|
|
|
updateMarkEnableStatus({
|
|
|
|
|
status: 0,
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
//console.log(res);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
//绘制线缆方法
|
|
|
|
|
drawline() {
|
|
|
|
|
this.canvas = this.$refs.myCanvas;
|
|
|
|
|
this.imgpic = this.$refs.picJpg;
|
|
|
|
|
this.canvas.width = this.imgpic.imageWidth; //设置画布大小
|
|
|
|
|
this.canvas.height = this.imgpic.imageHeight; //设置画布大小
|
|
|
|
|
this.ctx = this.canvas.getContext("2d");
|
|
|
|
|
|
|
|
|
|
if (this.flagLine == true) {
|
|
|
|
|
this.localPoints = this.localPoints;
|
|
|
|
|
} else {
|
|
|
|
|
this.localPoints = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.ctx.beginPath();
|
|
|
|
|
//设置线条颜色,必须放在绘制之前
|
|
|
|
|
this.ctx.strokeStyle = this.color;
|
|
|
|
|
// 线宽设置,必须放在绘制之前
|
|
|
|
|
this.ctx.lineWidth = this.borderwidth;
|
|
|
|
|
|
|
|
|
|
if (this.localPoints == null) {
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
for (var i = 0; i < this.localPoints.length; i++) {
|
|
|
|
|
this.ctx.moveTo(
|
|
|
|
|
this.localPoints[i].x1 * this.imgpic.imageWidth,
|
|
|
|
|
this.localPoints[i].y1 * this.imgpic.imageHeight
|
|
|
|
|
);
|
|
|
|
|
this.ctx.lineTo(
|
|
|
|
|
this.localPoints[i].x2 * this.imgpic.imageWidth,
|
|
|
|
|
this.localPoints[i].y2 * this.imgpic.imageHeight
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
this.ctx.closePath();
|
|
|
|
|
this.ctx.stroke();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// this.ctx.beginPath(); //开始路径
|
|
|
|
|
// this.ctx.moveTo(100, 100); //三角形,左顶点
|
|
|
|
|
// this.ctx.lineTo(300, 100); //右顶点
|
|
|
|
|
// this.ctx.lineTo(300, 300); //底部的点
|
|
|
|
|
// this.ctx.closePath(); //结束路径
|
|
|
|
|
// this.ctx.stroke(); //描边路径
|
|
|
|
|
},
|
|
|
|
|
//点击大图左右按钮
|
|
|
|
|
leftClick() {
|
|
|
|
|
console.log(this.photoNum);
|
|
|
|
|
this.activeSmall--;
|
|
|
|
|
this.$refs.scrollBox.scrollLeft -=
|
|
|
|
|
this.$refs.scrollBox.offsetWidth / this.photoNum;
|
|
|
|
|
this.changeBigPic(this.terminalPhoto[this.activeSmall], this.activeSmall);
|
|
|
|
|
},
|
|
|
|
|
rightClick() {
|
|
|
|
|
console.log(this.photoNum);
|
|
|
|
|
this.activeSmall++;
|
|
|
|
|
this.$refs.scrollBox.scrollLeft +=
|
|
|
|
|
this.$refs.scrollBox.offsetWidth / this.photoNum;
|
|
|
|
|
this.changeBigPic(this.terminalPhoto[this.activeSmall], this.activeSmall);
|
|
|
|
|
},
|
|
|
|
|
//获取第一张大图
|
|
|
|
|
changeBigPic(data, i) {
|
|
|
|
|
// //console.log("鼠标222222222", this.currentPage, this.activeSmall);
|
|
|
|
|
this.picDataAlarm = data;
|
|
|
|
|
this.srcList = [];
|
|
|
|
|
this.localPoints = [];
|
|
|
|
|
this.activeSmall = i;
|
|
|
|
|
this.mediaType = data.mediaType;
|
|
|
|
|
this.currentPicPath = data.path;
|
|
|
|
|
this.srcList.push(data.path);
|
|
|
|
|
if (data.width != undefined) {
|
|
|
|
|
this.radioPx = data.width + "x" + data.height;
|
|
|
|
|
} else {
|
|
|
|
|
this.radioPx = "";
|
|
|
|
|
}
|
|
|
|
|
if (data.fileSize !== undefined) {
|
|
|
|
|
const sizeInBytes = data.fileSize;
|
|
|
|
|
const sizeInMB = sizeInBytes / (1024 * 1024);
|
|
|
|
|
const sizeInKB = sizeInBytes / 1024;
|
|
|
|
|
|
|
|
|
|
if (sizeInMB >= 1) {
|
|
|
|
|
this.fileSize = `${sizeInMB.toFixed(2)}M`; // 大于等于1MB,以MB为单位,保留两位小数
|
|
|
|
|
} else {
|
|
|
|
|
this.fileSize = `${sizeInKB.toFixed(0)}K`; // 小于1MB,以KB为单位,保留两位小数
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.fileSize = ""; // 如果data.fileSize未定义,则设置为空字符串
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// console.log(data.channelId);
|
|
|
|
|
if (data.channelId) {
|
|
|
|
|
this.getPointList(data);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
loadImage() {
|
|
|
|
|
console.log("loading");
|
|
|
|
|
this.picLoading = false;
|
|
|
|
|
this.drawlineBig(this.picDataAlarm);
|
|
|
|
|
},
|
|
|
|
|
setDefaultImage(e) {
|
|
|
|
|
e.target.src = defaultImage;
|
|
|
|
|
this.picLoading = false;
|
|
|
|
|
},
|
|
|
|
|
//鼠标滚动
|
|
|
|
|
handleScroll(e) {
|
|
|
|
|
let direction = e.deltaY > 0 ? "down" : "up"; //deltaY为正则滚轮向下,为负滚轮向上
|
|
|
|
|
if (direction == "down") {
|
|
|
|
|
this.$refs.scrollBox.scrollLeft +=
|
|
|
|
|
(this.$refs.scrollBox.offsetWidth / this.photoNum) * 2;
|
|
|
|
|
}
|
|
|
|
|
if (direction == "up") {
|
|
|
|
|
this.$refs.scrollBox.scrollLeft -=
|
|
|
|
|
(this.$refs.scrollBox.offsetWidth / this.photoNum) * 2;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
//缩略图的左右箭头
|
|
|
|
|
smallLeftClick() {
|
|
|
|
|
this.$refs.scrollBox.scrollLeft -= this.$refs.scrollBox.offsetWidth;
|
|
|
|
|
this.$forceUpdate(); // 强制 Vue 重新渲染
|
|
|
|
|
},
|
|
|
|
|
smallRightClick() {
|
|
|
|
|
this.$refs.scrollBox.scrollLeft += this.$refs.scrollBox.offsetWidth;
|
|
|
|
|
this.$forceUpdate(); // 强制 Vue 重新渲染
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
//绘制大图告警区域
|
|
|
|
|
//绘制大图告警区域
|
|
|
|
|
drawlineBig(data) {
|
|
|
|
|
console.log(data);
|
|
|
|
|
this.canvas = document.getElementById("alarmCanvas");
|
|
|
|
|
this.imgpic = document.getElementById("alarmPic");
|
|
|
|
|
console.log(document.getElementById("alarmCanvas"));
|
|
|
|
|
console.log(document.getElementById("alarmPic"));
|
|
|
|
|
console.log(this.canvas);
|
|
|
|
|
console.log(this.imgpic);
|
|
|
|
|
this.textInfo = data.enname;
|
|
|
|
|
this.canvas.width = this.imgpic.offsetWidth; //设置画布大小
|
|
|
|
|
this.canvas.height = this.imgpic.offsetHeight; //设置画布大小
|
|
|
|
|
|
|
|
|
|
console.log(this.canvas.width, this.canvas.height);
|
|
|
|
|
this.ctx = this.canvas.getContext("2d");
|
|
|
|
|
this.ctx.beginPath();
|
|
|
|
|
//设置线条颜色,必须放在绘制之前
|
|
|
|
|
this.ctx.strokeStyle = "#ff0000";
|
|
|
|
|
// 线宽设置,必须放在绘制之前
|
|
|
|
|
this.ctx.lineWidth = 2;
|
|
|
|
|
this.labelMarkArrs = data.alarmlist;
|
|
|
|
|
this.recArrs = [];
|
|
|
|
|
for (var i = 0; i < this.labelMarkArrs.length; i++) {
|
|
|
|
|
console.log(this.labelMarkArrs[i]);
|
|
|
|
|
//获取的数据转化一下
|
|
|
|
|
this.recArrs.push({
|
|
|
|
|
x:
|
|
|
|
|
this.labelMarkArrs[i].x * this.canvas.width -
|
|
|
|
|
(this.labelMarkArrs[i].width * this.canvas.width) / 2,
|
|
|
|
|
y:
|
|
|
|
|
this.labelMarkArrs[i].y * this.canvas.height -
|
|
|
|
|
(this.labelMarkArrs[i].height * this.canvas.height) / 2,
|
|
|
|
|
w: this.labelMarkArrs[i].width * this.canvas.width,
|
|
|
|
|
h: this.labelMarkArrs[i].height * this.canvas.height,
|
|
|
|
|
text: this.labelMarkArrs[i].enname + this.labelMarkArrs[i].prob + "%",
|
|
|
|
|
type: this.labelMarkArrs[i].label,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
console.log(this.recArrs);
|
|
|
|
|
if (!this.recArrs.length) return;
|
|
|
|
|
for (var i = 0; i < this.recArrs.length; i++) {
|
|
|
|
|
// >2的判断是为了防止误触画出来的数据
|
|
|
|
|
if (this.recArrs[i].w > 2 && this.recArrs[i].h > 2) {
|
|
|
|
|
this.ctx.beginPath();
|
|
|
|
|
this.ctx.lineWidth = 2; // 矩形框的线条宽度
|
|
|
|
|
this.ctx.strokeStyle = "rgb(255, 255, 0)"; // 矩形框的线条颜色
|
|
|
|
|
// 设置填充样式
|
|
|
|
|
// this.ctx.fillStyle = "rgba(22, 158, 140, 0.4)"; // 蓝色,半透明
|
|
|
|
|
this.ctx.strokeRect(
|
|
|
|
|
this.recArrs[i].x,
|
|
|
|
|
this.recArrs[i].y,
|
|
|
|
|
this.recArrs[i].w,
|
|
|
|
|
this.recArrs[i].h
|
|
|
|
|
); // 矩形框
|
|
|
|
|
// this.ctx.fillRect(
|
|
|
|
|
// this.recArrs[i].x,
|
|
|
|
|
// this.recArrs[i].y,
|
|
|
|
|
// this.recArrs[i].w,
|
|
|
|
|
// this.recArrs[i].h
|
|
|
|
|
// ); // 填充矩形
|
|
|
|
|
// 如果有文本信息,填充文本信息
|
|
|
|
|
if (this.recArrs[i].text) {
|
|
|
|
|
this.ctx.font = "100 18px 微软雅黑";
|
|
|
|
|
this.ctx.lineWidth = 1;
|
|
|
|
|
this.ctx.strokeStyle = "rgb(255,255,0)";
|
|
|
|
|
this.ctx.strokeText(
|
|
|
|
|
this.recArrs[i].text,
|
|
|
|
|
this.recArrs[i].x +
|
|
|
|
|
this.recArrs[i].w / 2 -
|
|
|
|
|
(this.recArrs[i].text.length / 2) * 16,
|
|
|
|
|
this.recArrs[i].y - 20 < 0
|
|
|
|
|
? this.recArrs[i].y + this.recArrs[i].h + 20
|
|
|
|
|
: this.recArrs[i].y - 10
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.ctx.closePath();
|
|
|
|
|
this.ctx.stroke();
|
|
|
|
|
},
|
|
|
|
|
//绘制大图告警区域
|
|
|
|
|
drawlineBig2(data) {
|
|
|
|
|
console.log(data);
|
|
|
|
|
this.canvas = document.getElementById("bigCanvas2");
|
|
|
|
|
this.imgpic = document.getElementById("bigimg2");
|
|
|
|
|
console.log(document.getElementById("alarmCanvas"));
|
|
|
|
|
console.log(document.getElementById("bigimg2"));
|
|
|
|
|
console.log(this.canvas);
|
|
|
|
|
console.log(this.imgpic);
|
|
|
|
|
this.textInfo = data.enname;
|
|
|
|
|
this.canvas.width = this.imgpic.offsetWidth; //设置画布大小
|
|
|
|
|
this.canvas.height = this.imgpic.offsetHeight; //设置画布大小
|
|
|
|
|
|
|
|
|
|
console.log(this.canvas.width, this.canvas.height);
|
|
|
|
|
this.ctx = this.canvas.getContext("2d");
|
|
|
|
|
this.ctx.beginPath();
|
|
|
|
|
//设置线条颜色,必须放在绘制之前
|
|
|
|
|
this.ctx.strokeStyle = "#ff0000";
|
|
|
|
|
// 线宽设置,必须放在绘制之前
|
|
|
|
|
this.ctx.lineWidth = 2;
|
|
|
|
|
this.labelMarkArrs = data.alarmlist;
|
|
|
|
|
this.recArrs = [];
|
|
|
|
|
for (var i = 0; i < this.labelMarkArrs.length; i++) {
|
|
|
|
|
console.log(this.labelMarkArrs[i]);
|
|
|
|
|
//获取的数据转化一下
|
|
|
|
|
this.recArrs.push({
|
|
|
|
|
x:
|
|
|
|
|
this.labelMarkArrs[i].x * this.canvas.width -
|
|
|
|
|
(this.labelMarkArrs[i].width * this.canvas.width) / 2,
|
|
|
|
|
y:
|
|
|
|
|
this.labelMarkArrs[i].y * this.canvas.height -
|
|
|
|
|
(this.labelMarkArrs[i].height * this.canvas.height) / 2,
|
|
|
|
|
w: this.labelMarkArrs[i].width * this.canvas.width,
|
|
|
|
|
h: this.labelMarkArrs[i].height * this.canvas.height,
|
|
|
|
|
text: this.labelMarkArrs[i].enname + this.labelMarkArrs[i].prob + "%",
|
|
|
|
|
type: this.labelMarkArrs[i].label,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
console.log(this.recArrs);
|
|
|
|
|
if (!this.recArrs.length) return;
|
|
|
|
|
for (var i = 0; i < this.recArrs.length; i++) {
|
|
|
|
|
// >2的判断是为了防止误触画出来的数据
|
|
|
|
|
if (this.recArrs[i].w > 2 && this.recArrs[i].h > 2) {
|
|
|
|
|
this.ctx.beginPath();
|
|
|
|
|
this.ctx.lineWidth = 2; // 矩形框的线条宽度
|
|
|
|
|
this.ctx.strokeStyle = "rgb(255, 255, 0)"; // 矩形框的线条颜色
|
|
|
|
|
// 设置填充样式
|
|
|
|
|
// this.ctx.fillStyle = "rgba(22, 158, 140, 0.4)"; // 蓝色,半透明
|
|
|
|
|
this.ctx.strokeRect(
|
|
|
|
|
this.recArrs[i].x,
|
|
|
|
|
this.recArrs[i].y,
|
|
|
|
|
this.recArrs[i].w,
|
|
|
|
|
this.recArrs[i].h
|
|
|
|
|
); // 矩形框
|
|
|
|
|
// this.ctx.fillRect(
|
|
|
|
|
// this.recArrs[i].x,
|
|
|
|
|
// this.recArrs[i].y,
|
|
|
|
|
// this.recArrs[i].w,
|
|
|
|
|
// this.recArrs[i].h
|
|
|
|
|
// ); // 填充矩形
|
|
|
|
|
// 如果有文本信息,填充文本信息
|
|
|
|
|
if (this.recArrs[i].text) {
|
|
|
|
|
this.ctx.font = "100 16px 微软雅黑";
|
|
|
|
|
this.ctx.lineWidth = 2;
|
|
|
|
|
this.ctx.strokeStyle = "rgb(255,255,0)";
|
|
|
|
|
this.ctx.strokeText(
|
|
|
|
|
this.recArrs[i].text,
|
|
|
|
|
this.recArrs[i].x +
|
|
|
|
|
this.recArrs[i].w / 2 -
|
|
|
|
|
(this.recArrs[i].text.length / 2) * 16,
|
|
|
|
|
this.recArrs[i].y - 20 < 0
|
|
|
|
|
? this.recArrs[i].y + this.recArrs[i].h + 20
|
|
|
|
|
: this.recArrs[i].y - 10
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.ctx.closePath();
|
|
|
|
|
this.ctx.stroke();
|
|
|
|
|
},
|
|
|
|
|
//放大图
|
|
|
|
|
handleBigPicbox(val) {
|
|
|
|
|
console.log(val);
|
|
|
|
|
this.showBigpic = true;
|
|
|
|
|
this.bigImgPath = val;
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
this.drawlineBig2(this.picDataAlarm);
|
|
|
|
|
});
|
|
|
|
|
}, 100);
|
|
|
|
|
},
|
|
|
|
|
closePic(e) {
|
|
|
|
|
console.log(e);
|
|
|
|
|
var btn = this.$refs.bigimgref;
|
|
|
|
|
console.log(btn);
|
|
|
|
|
if (btn) {
|
|
|
|
|
if (!btn.contains(event.target)) {
|
|
|
|
|
//按钮.app-download以外的区域
|
|
|
|
|
this.zoomD = 1;
|
|
|
|
|
this.showBigpic = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//
|
|
|
|
|
// this.showBigpic = false;
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
<style lang="less">
|
|
|
|
|
.thumb-example {
|
|
|
|
|
width: 100%;
|
|
|
|
|
// display: flex;
|
|
|
|
|
// flex-direction: column;
|
|
|
|
|
height: calc(100% - 32px);
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
.radioBox {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 8px;
|
|
|
|
|
right: 24px;
|
|
|
|
|
color: #fff;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
}
|
|
|
|
|
.topPic {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 80%;
|
|
|
|
|
margin-bottom: 4px;
|
|
|
|
|
position: relative;
|
|
|
|
|
.bigPic {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
.el-image {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
img {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.myCanvas {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
z-index: 3;
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
}
|
|
|
|
|
#alarmCanvas {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
}
|
|
|
|
|
&:hover {
|
|
|
|
|
.arrow {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
transition: all 0.5s ease-in;
|
|
|
|
|
}
|
|
|
|
|
.downBtn {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
transition: all 0.5s ease-in;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.arrow {
|
|
|
|
|
opacity: 0;
|
|
|
|
|
position: absolute;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
border-radius: 30px;
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 50%;
|
|
|
|
|
transform: translateY(-50%);
|
|
|
|
|
color: #4cdbc8;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
background-color: rgba(31, 45, 61, 0.8);
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
|
|
|
|
text-align: center;
|
|
|
|
|
line-height: 60px;
|
|
|
|
|
width: 40px;
|
|
|
|
|
height: 40px;
|
|
|
|
|
z-index: 4;
|
|
|
|
|
&:hover {
|
|
|
|
|
background-color: rgba(31, 45, 61, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.leftArrow {
|
|
|
|
|
left: 16px;
|
|
|
|
|
}
|
|
|
|
|
.rightArrow {
|
|
|
|
|
right: 16px;
|
|
|
|
|
}
|
|
|
|
|
.downBtn {
|
|
|
|
|
position: absolute;
|
|
|
|
|
background: rgba(0, 0, 0, 0.5);
|
|
|
|
|
border: none;
|
|
|
|
|
right: 24px;
|
|
|
|
|
bottom: 24px;
|
|
|
|
|
color: #fff;
|
|
|
|
|
z-index: 5;
|
|
|
|
|
opacity: 0;
|
|
|
|
|
&:hover {
|
|
|
|
|
background: rgba(0, 0, 0, 0.9);
|
|
|
|
|
color: #169e8c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.bottomPic {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 20%;
|
|
|
|
|
margin-bottom: 6px;
|
|
|
|
|
.scrollPicContain {
|
|
|
|
|
// width: 1380px;
|
|
|
|
|
display: flex;
|
|
|
|
|
height: 100%;
|
|
|
|
|
position: relative;
|
|
|
|
|
.arrow {
|
|
|
|
|
opacity: 0;
|
|
|
|
|
position: absolute;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
border-radius: 30px;
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 50%;
|
|
|
|
|
transform: translateY(-50%);
|
|
|
|
|
color: #4cdbc8;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
background-color: rgba(31, 45, 61, 0.8);
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
|
|
|
|
text-align: center;
|
|
|
|
|
line-height: 60px;
|
|
|
|
|
width: 30px;
|
|
|
|
|
height: 30px;
|
|
|
|
|
z-index: 4;
|
|
|
|
|
&:hover {
|
|
|
|
|
background-color: rgba(31, 45, 61, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.leftArrow {
|
|
|
|
|
left: 16px;
|
|
|
|
|
}
|
|
|
|
|
.rightArrow {
|
|
|
|
|
right: 16px;
|
|
|
|
|
}
|
|
|
|
|
&:hover {
|
|
|
|
|
.arrow {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
transition: all 0.5s ease-in;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.el-car-item {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
display: flex;
|
|
|
|
|
overflow-x: hidden;
|
|
|
|
|
overflow-y: hidden;
|
|
|
|
|
scroll-behavior: smooth;
|
|
|
|
|
.smallPic {
|
|
|
|
|
width: 19.2%;
|
|
|
|
|
border: 3px solid transparent;
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
position: relative;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
.picBox {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
img {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
.timeInfo {
|
|
|
|
|
position: absolute;
|
|
|
|
|
bottom: 0px;
|
|
|
|
|
width: 100%;
|
|
|
|
|
background: #f0f0f0;
|
|
|
|
|
padding: 6px 0;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
text-align: center;
|
|
|
|
|
color: #333;
|
|
|
|
|
.el-icon-video-camera {
|
|
|
|
|
font-size: 20px;
|
|
|
|
|
margin-right: 8px;
|
|
|
|
|
align-items: center;
|
|
|
|
|
vertical-align: sub;
|
|
|
|
|
color: #169e8c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.alarmSpan {
|
|
|
|
|
color: #f00;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.moreSmallPic {
|
|
|
|
|
width: 9.8%;
|
|
|
|
|
}
|
|
|
|
|
.borderActive {
|
|
|
|
|
.timeInfo {
|
|
|
|
|
color: #fff;
|
|
|
|
|
background: linear-gradient(180deg, #4cdbc8 10%, #128071);
|
|
|
|
|
}
|
|
|
|
|
.alarmSpan {
|
|
|
|
|
color: #f00;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.littlePic {
|
|
|
|
|
justify-content: center;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.showPic {
|
|
|
|
|
position: fixed;
|
|
|
|
|
background-color: rgba(0, 0, 0, 50%);
|
|
|
|
|
bottom: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
right: 0;
|
|
|
|
|
top: 0;
|
|
|
|
|
z-index: 9999;
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
display: flex;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
.picboxI {
|
|
|
|
|
position: relative;
|
|
|
|
|
width: 90%;
|
|
|
|
|
height: 90%;
|
|
|
|
|
margin: auto;
|
|
|
|
|
animation-name: scaleDraw;
|
|
|
|
|
/*关键帧名称*/
|
|
|
|
|
animation-timing-function: ease;
|
|
|
|
|
/*动画的速度曲线*/
|
|
|
|
|
animation-iteration-count: 1;
|
|
|
|
|
/*动画播放的次数*/
|
|
|
|
|
animation-duration: 0.65s;
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
img {
|
|
|
|
|
max-width: 100%;
|
|
|
|
|
max-height: 100%;
|
|
|
|
|
margin: auto;
|
|
|
|
|
position: absolute;
|
|
|
|
|
cursor: grab;
|
|
|
|
|
}
|
|
|
|
|
.mybigCanvas {
|
|
|
|
|
position: absolute;
|
|
|
|
|
// top: 0;
|
|
|
|
|
// left: 0;
|
|
|
|
|
max-width: 100%;
|
|
|
|
|
max-height: 100%;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.viewClose {
|
|
|
|
|
-webkit-app-region: no-drag;
|
|
|
|
|
background-color: rgba(0, 0, 0, 0.5);
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
height: 80px;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: -40px;
|
|
|
|
|
top: -40px;
|
|
|
|
|
transition: background-color 0.15s;
|
|
|
|
|
width: 80px;
|
|
|
|
|
.el-icon-close {
|
|
|
|
|
bottom: 16px;
|
|
|
|
|
left: 16px;
|
|
|
|
|
position: absolute;
|
|
|
|
|
color: #fff;
|
|
|
|
|
font-size: 18px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|