vue组件canvas实现图片涂鸦

更新时间:2023-05-09 21:11:55 阅读: 评论:0

vue组件canvas实现图⽚涂鸦
效果图
⽅案背景
需求
1 需要对图⽚进⾏标注,导出图⽚。
2 需要标注N多图⽚最后同时保存。
3 需要根据多边形区域数据(区域、颜⾊、名称)标注。
对应⽅案
1 ⽤canvas实现涂鸦、圆形、矩形的绘制,最终⽣成图⽚ba64编码⽤于上传
2 ⼤量图⽚批量上传很耗时间,为了提⾼⽤户体验,改为只实现圆形、矩形绘制,最终保存成坐标,下次显⽰时根据坐标再绘制。
3 多边形区域的显⽰是根据坐标点绘制,名称显⽰的位置为多边形质⼼。
代码
<template>
<!-- canvas图⽚区域选择画布 -->
<div>
<canvas
:id="radom"
:class="{canDraw: 'canvas'}"
:width="width"
:height="height"
:
@moudown="canvasDown($event)"
@mouup="canvasUp($event)"
@moumove="canvasMove($event)"
@touchstart="canvasDown($event)"      @touchend="canvasUp($event)"
@touchmove="canvasMove($event)">    </canvas>
</div>
</template>
<script>
/
/ import proxy from './proxy.js'
//  const uuid = require('node-uuid')
export default {
props: {
canDraw: { // 图⽚路径
type: Boolean,
default: true
},
url: { // 图⽚路径
type: String,
default:'/img/quyu_bg.jpg'
},
info: { // 位置点信息
type: Array
},
width: { // 绘图区域宽度
type: String,
default:'600'
},
height: { // 绘图区域⾼度
type: String,
default:'400'
},
lineColor: { // 画笔颜⾊
type: String,
default: 'red'
},
lineWidth: { // 画笔宽度
type: Number,
default: 2
},
lineType: { // 画笔类型
type: String,
default: 'rec'
}
},
watch: {
info (val) {
console.log(val)
if (val) {
this.initDraw()
}
}
},
data () {
return {
// 同⼀页⾯多次渲染时,⽤于区分元素的id        radom: 'canvas1',
// canvas对象
context: {},
// 是否处于绘制状态
canvasMoveU: fal,
// 绘制矩形和椭圆时⽤来保存起始点信息
beginRec: {
x: '',
y: '',
imageData: ''
},
// 储存坐标信息
drawInfo: [],
// 背景图⽚缓存
img: new Image()
}
},
mounted () {
this.initDraw()
},
methods: {
// 初始化绘制信息
initDraw () {
// 初始化画布
const canvas = ElementById(this.radom)        t = Context('2d')
// 初始化背景图⽚
this.img.tAttribute('crossOrigin', 'Anonymous')
this.img.src = '/img/quyu_bg.jpg'
r = () => {
var timeStamp = +new Date()
this.img.src = this.url + '?' + timeStamp
}
load = () => {
this.clean()
}
// Ba64({imgUrl: this.url}).then((res) => {
//  if (de * 1 === 0) {
//    this.img.src = 'data:image/jpeg;ba64,'+res.data
//    load = () => {
//      this.clean()
//    }
//  }
/
/ })
// 初始化画笔
},
// ⿏标按下
canvasDown (e) {
//清空画布
this.clean()
if (this.canDraw) {
this.canvasMoveU = true
/
/ client是基于整个页⾯的坐标,layer是基于画布坐标,offt是cavas距离pictureDetail顶部以及左边的距离          const canvasX = e.layerX - e.target.parentNode.offtLeft
const canvasY = e.layerY - e.target.parentNode.offtTop
// 记录起始点和起始状态
this.beginRec.x = canvasX
this.beginRec.y = canvasY
this.beginRec.imageData = ImageData(0, 0, this.width, this.height)
// 存储本次绘制坐标信息

本文发布于:2023-05-09 21:11:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/567249.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:绘制   区域   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图