hberp/hb_client/src/views/testModel/markImage.vue

314 lines
9.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<button type="button" class="btn btn-warning" @click="error1">错误</button>
<button @click="word1()">文字</button>
<button @click="restuya()">清除批注</button>
<button @click="back()">回退</button>
<button @click="saveTu()">保存</button>
<hr>
<img id="canvasImg" src="./../../assets/404_images/404.png" style="display: none">
<div style="position: relative;">
<canvas id="canvas" width="700" height="500" >
您的浏览器不支持绘图请升级或更换浏览器
</canvas>
<input type="text" value="" class="hide" id="txt" placeholder="请输入文字">
<textarea class="hide" id="word" cols="30" rows="10" placeholder="请输入文字" autofocus></textarea>
<input id="inputV" type="hidden" value="1">
<span>保存的图片</span>
<div id="res"></div>
</div>
</div>
</template>
<script>
let preDrawAry = [];
let img = new Image();
export default {
data() {
return {
canvas:null,
ctx:null,
myCanvas_rect:null,
Txt:null,
word:null,
widths:0,
heights:0,
lineW:3,
colorF:"#e42343",
imgData:'',
}
},
mounted(){
let _this=this;
preDrawAry = [];
let canvas = document.getElementById('canvas');
this.canvas = document.getElementById('canvas');
this.ctx = canvas.getContext('2d');
this.myCanvas_rect = this.canvas.getBoundingClientRect();
this.Txt = document.getElementById('txt');
this.word = document.getElementById('word');
this.widths = this.myCanvas_rect.width;
this.heights = this.myCanvas_rect.height;
setTimeout(function(){
_this.draw();
},1000)
/*
this.ctx .clearRect(0, 0, 700, 500);
let imgs = new Image();
imgs.src ="./../../assets/404_images/404.png";
setTimeout(function(){
this.draw();
this.ctx.drawImage(imgs,0,0,700,500);
},1000)*/
/* imgs.onload=function(){
this.ctx.drawImage(imgs,0,0,700,500);
this.ctx.closePath();
let pattern=this.ctx.createPattern(imgs,"no-repeat")//不加
this.ctx.fillStyle=pattern;
this.ctx.fillRect(0,0,700,500);
}*/
},
methods: {
draw(){
debugger;
let canvasImg = document.getElementById("canvasImg");
canvasImg.style.width = '700px';
canvasImg.style.height = '500px';
this.ctx.drawImage(canvasImg,0,0,700,500);
},
// 叉号
error1(){
let canvas1 = document.getElementById('canvas');
let ctx1 = canvas1.getContext('2d');
this.Txt.style.display="none";
this.word.style.display="none";
ctx1.closePath();
canvas1.onmousedown=function () {
this.imgData= ctx1.getImageData(0,0,canvas1.width,canvas1.height);
preDrawAry.push(this.imgData);
ctx1.beginPath();
ctx1.strokeStyle = "#e42343";
ctx1.lineWidth = "3";
ctx1.lineJoin="round";
};
//鼠标按下的位置
canvas1.onmouseup=function (ev) {
let oldX = ev.offsetX;
let oldY = ev.offsetY;
ctx1.moveTo(oldX,oldY);
ctx1.lineTo(ev.offsetX+10,ev.offsetY+10);
ctx1.moveTo(ev.offsetX+10,ev.offsetY);
ctx1.lineTo(ev.offsetX,ev.offsetY+10);
ctx1.stroke();
};
this.ctx.closePath();
},
// 文字先写字
text(){
let canvas2 = document.getElementById('canvas');
let ctx2 = canvas2.getContext('2d');
let Txt2 = document.getElementById('txt');
Txt2.style.display="block";
this.word.style.display="none";
ctx2.font="16px Microsoft Yahei";
canvas2.onmousedown=function (ev) {
this.imgData=ctx2.getImageData(0,0,canvas2.width,canvas2.height);
preDrawAry.push(this.imgData);
var v = Txt2.value;
// console.log(v);
if (v != '') {
var oldX = ev.offsetX;
var oldY = ev.offsetY;
// console.log(oldX,oldY);
ctx2.moveTo(oldX,oldY);
canvas2.onmouseup=function () {
ctx2.fillStyle=this.colorF;
ctx2.fillText(v,oldX,oldY);
canvas2.TextAutoLine(v,canvas2,oldX,oldY,20);
// Txt.value = "";
Txt2.style.display="none";
}
}
}
},
// 文字
word1(){
let canvas3 = document.getElementById('canvas');
let ctx3 = canvas3.getContext('2d');
let Txt3 = document.getElementById('txt');
let word3 = document.getElementById('word');
Txt3.style.display="none";
ctx3.font="16px Microsoft Yahei";
canvas3.onmousedown=function () {
ctx3.closePath();
}
canvas3.onmouseup=function (ev) {
var inputV= document.getElementById('inputV').value;
if(inputV == 1){
document.getElementById('word').focus();
// console.log(ev.offsetX,ev.offsetY);
var oldX = ev.offsetX;
var oldY = ev.offsetY;
word3.style.display="block";
word3.style.left=oldX+'px';
word3.style.top =oldY+'px';
word3.onblur=function () {
let v = word3.value;
if(v != '' && v != ' '){
this.imgData=ctx3.getImageData(0,0,canvas3.width,canvas3.height);
let img = ctx3.getImageData(0,0,canvas3.width,canvas3.height);
debugger;
preDrawAry.push(img);
ctx3.moveTo(oldX,oldY);
ctx3.fillStyle="#e42343";
let lineWidth = 0;
let canvasWidth = canvas3.width;
let lastSubStrIndex= 0;
for(let i=0;i<v.length;i++){
lineWidth+=ctx3.measureText(v[i]).width;
if(lineWidth>canvasWidth-oldX){
ctx3.fillText(v.substring(lastSubStrIndex,i),oldX,oldY);
oldY+=20;
lineWidth=0;
lastSubStrIndex=i;
}
if(i==v.length-1){
ctx3.fillText(v.substring(lastSubStrIndex,i+1),oldX,oldY);
}
}
inputV ="2";
word3.value = "";
}
}
}
}
},
// 文字过长超出换行toDataURL()
canvasTextAutoLine(str,canvas,initX,initY,lineHeight){
let ctx = canvas.getContext("2d");
let lineWidth = 0;
let canvasWidth = canvas.width;
let lastSubStrIndex= 0;
for(let i=0;i<str.length;i++){
lineWidth+=ctx.measureText(str[i]).width;
if(lineWidth>canvasWidth-initX){
ctx.fillText(str.substring(lastSubStrIndex,i),initX,initY);
initY+=lineHeight;
lineWidth=0;
lastSubStrIndex=i;
}
if(i==str.length-1){
ctx.fillText(str.substring(lastSubStrIndex,i+1),initX,initY);
}
}
},
// 删除批注
restuya(){
this.word.style.display="none";
this.Txt.style.display="none";
this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);
window.location.reload();
},
// 撤销
back(){
this.word.style.display="none";
this.Txt.style.display="none";
if(preDrawAry.length>0) {
var popData = preDrawAry.pop();
this.ctx.putImageData(popData, 0, 0);
}
},
// 回退一次
put(){
this.ctx.putImageData(this.imgData,0,0);
},
//保存
saveTu(){
let canvas = document.getElementById('canvas');
var image = new Image();
image = canvas.toDataURL('image/png');
document.getElementById('res').innerHTML = '<img style="border: 1px solid #666666;" src="'+image+'">';
console.log(image);
debugger;
/*img.setAttribute('crossOrigin', 'Anonymous') ;// 解决某些图片跨域有些图片仍不可使用)
img.src = 'url';
img.onload = (imgs) => {
let base64 = this.setBase64(imgs);
var arr = base64.split(',');
var mime = arr[0].match(/:(.*?);/)[1] ;// 获取图片的类型 image/jpg)
var bstr = atob(arr[1]); // 将base64转码
var n = bstr.length ;// 获得转码长度
var u8arr = new Uint8Array(n); // 获得length个为0的数组
while (n--) {
u8arr[n] = bstr.charCodeAt(n) // 获得unicode码
}
this.file = new File([u8arr], 'faceImg', { type: mime }); // 生成文件
console.log(this.file);
this.url = base64
}*/
},
setBase64(img) {
let ctx = document.createElement('canvas');
const c = ctx.getContext('2d');
ctx.width = img.path[0].width;
ctx.height = img.path[0].height;
c.drawImage(img.path[0], 0, 0, img.path[0].width, img.path[0].height);
let ext = img.src
.substring(img.src.lastIndexOf('.') + 1)
.toLowerCase(); // 获取图片后缀
let url = ctx.toDataURL(`image/${ext}`);
return url
}
}
}
</script>
<style scoped>
canvas{
border:1px solid #000000;
cursor: crosshair;
}
.hide{
display: none;
}
#txt{
position: absolute;
top: 1%;
left: 1%;
width: 575px;
height: 30px;
border:1px solid #e42343;
}
#word{
position: absolute;
width: 220px;
height: 80px;
padding: 0 2px;
background:none;
color:#e42343;
border: 1px dashed #b9b9b9;
}
#word::-webkit-input-placeholder{
color:#e42343;
}
#word::-moz-placeholder{
color:#e42343;
}
#word::placeholder{
color:#e42343;
}
#res{
display: inline-block;
}
</style>