智能选区
This commit is contained in:
@@ -61,19 +61,20 @@ export class AISelectboxToolManager {
|
|||||||
this.isDragging = false
|
this.isDragging = false
|
||||||
this.canvasManager.canvas.renderAll()
|
this.canvasManager.canvas.renderAll()
|
||||||
}
|
}
|
||||||
|
demoObjectDefault = {
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
evented: false,
|
||||||
|
selectable: false,
|
||||||
|
erasable: false,
|
||||||
|
}
|
||||||
createDemoObject() {
|
createDemoObject() {
|
||||||
if (this.demoObject) this.clearDemoObject()
|
if (this.demoObject) this.clearDemoObject()
|
||||||
const { canvasWidth, canvasHeight } = this.canvasManager.getCanvasSize();
|
const { canvasWidth, canvasHeight } = this.canvasManager.getCanvasSize();
|
||||||
const canvas = document.createElement('canvas')
|
const canvas = document.createElement('canvas')
|
||||||
canvas.width = canvasWidth
|
canvas.width = canvasWidth
|
||||||
canvas.height = canvasHeight
|
canvas.height = canvasHeight
|
||||||
this.demoObject = new fabric.Image(canvas, {
|
this.demoObject = new fabric.Image(canvas, this.demoObjectDefault)
|
||||||
left: 0,
|
|
||||||
top: 0,
|
|
||||||
evented: false,
|
|
||||||
selectable: false,
|
|
||||||
erasable: false,
|
|
||||||
})
|
|
||||||
this.canvasManager.canvas.add(this.demoObject)
|
this.canvasManager.canvas.add(this.demoObject)
|
||||||
this.canvasManager.canvas.renderAll()
|
this.canvasManager.canvas.renderAll()
|
||||||
}
|
}
|
||||||
@@ -100,27 +101,47 @@ export class AISelectboxToolManager {
|
|||||||
this.canvasManager.canvas.remove(this.indicatorObject)
|
this.canvasManager.canvas.remove(this.indicatorObject)
|
||||||
this.indicatorObject = null
|
this.indicatorObject = null
|
||||||
}
|
}
|
||||||
// 处理画笔绘制图像
|
// 创建临时画布对象
|
||||||
async handleBrushDrawImage(fabricImage: fabric.Object) {
|
async createStaticCanvas(object: fabric.Object) {
|
||||||
if (!this.demoObject) return;
|
if (!this.demoObject) this.createDemoObject()
|
||||||
const tcanvas = new fabric.StaticCanvas(document.createElement("canvas"), {
|
const canvas = new fabric.StaticCanvas(document.createElement("canvas"), {
|
||||||
width: this.demoObject.width,
|
width: this.demoObject.width,
|
||||||
height: this.demoObject.height,
|
height: this.demoObject.height,
|
||||||
enableRetinaScaling: false,
|
enableRetinaScaling: false,
|
||||||
});
|
});
|
||||||
const demoObject = await cloneObjects([this.demoObject]).then(v => v[0])
|
const newObject = await cloneObjects([object]).then(v => v[0])
|
||||||
tcanvas.add(demoObject)
|
canvas.add(newObject)
|
||||||
tcanvas.add(fabricImage)
|
canvas.renderAll()
|
||||||
|
return canvas
|
||||||
|
}
|
||||||
|
// 处理绘制图像
|
||||||
|
async handleDrawImage(object: fabric.Object) {
|
||||||
|
const tcanvas = await this.createStaticCanvas(this.demoObject)
|
||||||
|
tcanvas.add(object)
|
||||||
tcanvas.renderAll();
|
tcanvas.renderAll();
|
||||||
const canvas = getObjectAlphaToCanvas(tcanvas, null, 0, this.rgba);
|
const canvas = getObjectAlphaToCanvas(tcanvas, null, 0, this.rgba);
|
||||||
const image = new fabric.Image(canvas);
|
this.replaceDemoObject(canvas)
|
||||||
|
}
|
||||||
|
// 处理图像删除
|
||||||
|
async handleRemoveImage(object: fabric.Object) {
|
||||||
|
const tcanvas = await this.createStaticCanvas(this.demoObject)
|
||||||
|
const rcanvas = await this.createStaticCanvas(object)
|
||||||
|
const tempCanvas = rcanvas.toCanvasElement();
|
||||||
|
const tempCtx = tempCanvas.getContext('2d');
|
||||||
|
const imageData2 = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height);
|
||||||
|
const canvas = getObjectAlphaToCanvas(tcanvas, imageData2, 0, this.rgba);
|
||||||
|
this.replaceDemoObject(canvas)
|
||||||
|
}
|
||||||
|
// 替换框选对象
|
||||||
|
async replaceDemoObject(canvas) {
|
||||||
|
const image = new fabric.Image(canvas, this.demoObjectDefault);
|
||||||
this.canvasManager.canvas.add(image)
|
this.canvasManager.canvas.add(image)
|
||||||
this.canvasManager.canvas.remove(this.demoObject);
|
this.canvasManager.canvas.remove(this.demoObject);
|
||||||
this.demoObject = image;
|
this.demoObject = image;
|
||||||
this.canvasManager.canvas.renderAll()
|
this.canvasManager.canvas.renderAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
mouseDownEvent(e) {
|
mouseDownEvent(e) {
|
||||||
// if (true) return
|
|
||||||
const tool = this.toolManager.currentTool.value
|
const tool = this.toolManager.currentTool.value
|
||||||
const tools = [OperationType.AISELECT_ADD, OperationType.AISELECT_REMOVE]
|
const tools = [OperationType.AISELECT_ADD, OperationType.AISELECT_REMOVE]
|
||||||
if (!tools.includes(tool)) return;
|
if (!tools.includes(tool)) return;
|
||||||
@@ -153,11 +174,23 @@ export class AISelectboxToolManager {
|
|||||||
const object = this.indicatorObject.toJSON("evented")
|
const object = this.indicatorObject.toJSON("evented")
|
||||||
if (object.width === 0) object.width = 100
|
if (object.width === 0) object.width = 100
|
||||||
if (object.height === 0) object.height = 100
|
if (object.height === 0) object.height = 100
|
||||||
console.log(object.top, object.left, object.width, object.height)
|
|
||||||
this.clearIndicatorObject()
|
this.clearIndicatorObject()
|
||||||
this.canvasManager.canvas.renderAll()
|
this.canvasManager.canvas.renderAll()
|
||||||
|
|
||||||
// this.createSelectbox()
|
const rect = new fabric.Rect({
|
||||||
|
left: object.left,
|
||||||
|
top: object.top,
|
||||||
|
width: object.width,
|
||||||
|
height: object.height,
|
||||||
|
fill: '#f00',
|
||||||
|
strokeWidth: 0,
|
||||||
|
})
|
||||||
|
const currentTool = this.toolManager.currentTool.value
|
||||||
|
if (currentTool === OperationType.AISELECT_ADD) {
|
||||||
|
this.handleDrawImage(rect)
|
||||||
|
} else if (currentTool === OperationType.AISELECT_REMOVE) {
|
||||||
|
this.handleRemoveImage(rect)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -180,9 +213,7 @@ export class AISelectboxToolManager {
|
|||||||
absolutePositioned: true,
|
absolutePositioned: true,
|
||||||
};
|
};
|
||||||
async createSelectbox() {
|
async createSelectbox() {
|
||||||
// const url = "http://118.31.39.42:3000/falls/1a48ed3a-1faa-4fcd-bf07-765dba1702c5.png"
|
if (!this.demoObject) return
|
||||||
// const image = await this.loadImageToObject(url)
|
|
||||||
// const fobject = this.canvasManager.canvas.clipPath
|
|
||||||
const fobject = this.demoObject
|
const fobject = this.demoObject
|
||||||
this.clearDemoObject()
|
this.clearDemoObject()
|
||||||
const canvas = getObjectAlphaToCanvas(fobject, null, 0, { r: 255, g: 0, b: 0, a: 255 });
|
const canvas = getObjectAlphaToCanvas(fobject, null, 0, { r: 255, g: 0, b: 0, a: 255 });
|
||||||
@@ -208,8 +239,8 @@ export class AISelectboxToolManager {
|
|||||||
});
|
});
|
||||||
const group = await this.layerManager.createGroupLayer({
|
const group = await this.layerManager.createGroupLayer({
|
||||||
clipPath: path,
|
clipPath: path,
|
||||||
top: path.top,
|
top: path.top + path.height / 2,
|
||||||
left: path.left,
|
left: path.left + path.width / 2,
|
||||||
}, false, false)
|
}, false, false)
|
||||||
const rect = await this.layerManager.createRectLayer({
|
const rect = await this.layerManager.createRectLayer({
|
||||||
width: path.width,
|
width: path.width,
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ export class CanvasManager {
|
|||||||
if (currentTool === OperationType.DRAW) {
|
if (currentTool === OperationType.DRAW) {
|
||||||
this.handleDrawImage(fabricImage)
|
this.handleDrawImage(fabricImage)
|
||||||
} else if (currentTool === OperationType.AISELECT_DRAW) {
|
} else if (currentTool === OperationType.AISELECT_DRAW) {
|
||||||
this.stateManager.aiSelectboxToolManager.handleBrushDrawImage(fabricImage)
|
this.stateManager.aiSelectboxToolManager.handleDrawImage(fabricImage)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -714,7 +714,7 @@ export class CanvasEventManager {
|
|||||||
|
|
||||||
// 添加对象开始变换时的状态捕获
|
// 添加对象开始变换时的状态捕获
|
||||||
this.canvas.on("object:moving", (e) => {
|
this.canvas.on("object:moving", (e) => {
|
||||||
console.log("object:moving", e);
|
// console.log("object:moving", e);
|
||||||
const target = e.target;
|
const target = e.target;
|
||||||
if (target._objects && target._objects.length > 0) {
|
if (target._objects && target._objects.length > 0) {
|
||||||
target._objects.forEach((object) => {
|
target._objects.forEach((object) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user