ngx-image-annotation
Version:
A comprehensive Angular component for tagging images. Check out [the demo](https://pdkds7-4200.csb.app/) for some examples.
1 lines • 14.6 kB
Source Map (JSON)
{"version":3,"file":"ngx-image-annotation.mjs","sources":["../../../ngx-image-annotation/src/annotator.component.ts","../../../ngx-image-annotation/src/public-api.ts","../../../ngx-image-annotation/src/ngx-image-annotation.ts"],"sourcesContent":["import { Component, ElementRef, EventEmitter, Input, Output } from '@angular/core';\r\nimport { Director, Shape, Polygon, Rectangle, Circle, Ellipse, Dot, Shortcut, ActType, Util, ImageEl, SVGSVGEl } from 'image-labeling'\r\n\r\n@Component({\r\n selector: 'annotator',\r\n imports: [],\r\n template: `\r\n <div>\r\n <svg>\r\n </svg>\r\n </div>\r\n `,\r\n styles: ``\r\n})\r\nexport class AnnotatorComponent {\r\n getDirector = () => Director.instance!;\r\n @Output() onReady = new EventEmitter();\r\n @Output() onAdded = new EventEmitter<Shape>();\r\n @Output() onEdited = new EventEmitter<Shape>();\r\n @Output() onSelected = new EventEmitter<Shape>();\r\n @Output() onContextMenu = new EventEmitter<Shape>();\r\n @Input() set imageUrl(value: string) { \r\n Director.clear(this.elRef.nativeElement.querySelector('svg'));\r\n if(value) this.onload(value); \r\n }\r\n @Input() shapes?: Shape[] | any[];\r\n @Input() naturalSize?: boolean;\r\n @Input() width?: number | string;\r\n @Input() height?: number | string;\r\n @Input() discRadius?: number;\r\n @Input() hideBorder?: boolean;\r\n @Input() shortcut?: Shortcut;\r\n @Input() categoryOpt?: { vertical: 'top' | 'middle' | 'bottom' } | undefined;\r\n\r\n constructor(private elRef:ElementRef) {}\r\n \r\n stopAll = () => {\r\n let director = this.getDirector();\r\n director.stopDraw();\r\n director.stopEdit();\r\n }\r\n\r\n drawRectangle() {\r\n this.stopAll();\r\n this.getDirector().startDraw(new Rectangle());\r\n }\r\n\r\n drawPolygon() {\r\n this.stopAll();\r\n this.getDirector().startDraw(new Polygon());\r\n }\r\n\r\n drawCircle() {\r\n this.stopAll();\r\n this.getDirector().startDraw(new Circle());\r\n }\r\n\r\n drawEllipse() {\r\n this.stopAll();\r\n this.getDirector().startDraw(new Ellipse());\r\n }\r\n\r\n drawDot() {\r\n this.stopAll();\r\n this.getDirector().startDraw(new Dot());\r\n }\r\n\r\n stop = this.stopAll\r\n stopEdit = () => this.getDirector().stopEdit()\r\n edit = (id: number) => this.getDirector().edit(id)\r\n delete = (id: number) => this.getDirector().removeById(id)\r\n updateCategories = (id: number, categories: string[], color?: string) => this.getDirector().updateCategories(id, categories, color)\r\n\r\n zoom = (factor: number, relative: boolean = true) => {\r\n let director = this.getDirector();\r\n factor = director.setSizeAndRatio(factor, relative);\r\n director.zoom(factor);\r\n }\r\n\r\n getShapes = () => this.getDirector().getShapes()\r\n\r\n onload(imageUrl: string) {\r\n let svg = this.getWrapper(), container = this.getContainer();\r\n let onloaded = (target: ImageEl) => {\r\n let bb = target.bbox();\r\n let naturalWidth = bb.width, naturalHeight = bb.height, ratio = 1, sw = container.parentElement?.scrollWidth ?? 0, \r\n width = Util.toPx(sw, this.width), height = Util.toPx(sw, this.height);\r\n svg.addClass('il-svg');\r\n Object.assign(container.style, {\r\n width: (width || naturalWidth) + 'px',\r\n height: (height || naturalHeight) + 'px',\r\n overflow: 'hidden',\r\n backgroundColor: '#e6e6e6'\r\n });\r\n if (!this.naturalSize) {\r\n if (!width) width = container.scrollWidth;\r\n if (!height) height = container.scrollHeight;\r\n if (width! / height! > bb.width / bb.height)\r\n ratio = Math.min(height!, bb.height) / naturalHeight;\r\n else ratio = Math.min(width!, bb.width) / naturalWidth;\r\n }\r\n target.size('100%', '100%');\r\n \r\n let statics = { \r\n width: naturalWidth, \r\n height: naturalHeight, \r\n ratio, \r\n discRadius: this.discRadius || 5, \r\n hb: this.hideBorder,\r\n shortcut: this.shortcut,\r\n categoryOpt: this.categoryOpt || { vertical: 'top' }\r\n }\r\n\r\n Director.init(svg, statics, container);\r\n this.drawShapes(this.shapes);\r\n this.onReady.emit();\r\n\r\n let actions = [\r\n { type: ActType.Added, func: (shape: Shape) => this.onAdded.emit(shape) },\r\n { type: ActType.Edited, func: (shape: Shape) => this.onEdited.emit(shape) },\r\n { type: ActType.Selected, func: (shape: Shape) => this.onSelected.emit(shape) },\r\n { type: ActType.CtxMenu, func: (shape: Shape) => this.onContextMenu.emit(shape) }\r\n ]\r\n Director.setActions(actions);\r\n\r\n }\r\n var image = svg.image(imageUrl, onloaded).size('', '').attr('onmousedown', 'return false').attr('oncontextmenu', 'return false');\r\n image.on('testEvent', (ev: CustomEvent) => onloaded(new ImageEl(ev.detail.testTarget)))\r\n }\r\n\r\n drawShapes(shapes?: Shape[] | any[]) {\r\n let director = this.getDirector();\r\n if (!shapes) return;\r\n director.setMaxId(Math.max(...shapes.map(c => c.id ?? 0)));\r\n let rectangles = shapes.filter(s => s instanceof Rectangle || s.type === 'rectangle')\r\n .map(s => new Rectangle([...s.points], s.categories, s.color, s.id));\r\n let polygons = shapes.filter(s => s instanceof Polygon || s.type === 'polygon')\r\n .map(s => new Polygon([...s.points], s.categories, s.color, s.id));\r\n let circles = shapes.filter(s => s instanceof Circle || s.type === 'circle')\r\n .map(s => new Circle(s.centre, s.radius, s.categories, s.color, s.id));\r\n let ellipses = shapes.filter(s => s instanceof Ellipse || s.type === 'ellipse')\r\n .map(s => new Ellipse(s.centre, s.radiusX, s.radiusY, s.categories, s.phi || 0, s.color, s.id));\r\n let dots = shapes.filter(s => s instanceof Dot || s.type === 'dot')\r\n .map(s => new Dot(s.position, s.categories, s.color, s.id));\r\n if (rectangles.length > 0) director.plot(rectangles);\r\n if (polygons.length > 0) director.plot(polygons);\r\n if (circles.length > 0) director.plot(circles);\r\n if (ellipses.length > 0) director.plot(ellipses);\r\n if (dots.length > 0) director.plot(dots);\r\n }\r\n\r\n getWrapper() {\r\n return new SVGSVGEl(this.elRef.nativeElement.querySelector('svg'));\r\n }\r\n\r\n getContainer() {\r\n return this.elRef.nativeElement.querySelector('svg').parentElement! as HTMLDivElement;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of annotator\r\n */\r\n\r\nimport { Circle, Dot, Ellipse, Polygon, Rectangle, Shape } from 'image-labeling';\r\nimport { AnnotatorComponent } from './annotator.component';\r\nexport {AnnotatorComponent, Circle, Dot, Ellipse, Polygon, Rectangle, Shape}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}