UNPKG

ngx-capture

Version:

Screen capture library for Angular

129 lines 16.5 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { Subject } from 'rxjs'; import { take, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "./ngx-capture.service"; export class NgxCaptureComponent { constructor(captureService) { this.captureService = captureService; this.resultImage = new EventEmitter(); this.isDrawing = false; this.mouseStart = { x: 0, y: 0 }; this.cropDimensions = { x: 0, y: 0, width: 0, height: 0, }; this.destroy$ = new Subject(); } ngOnInit() { setTimeout(() => { this.rect = this.rectangle.nativeElement; this.captureZone = this.overlay.nativeElement; if (!this.captureZone) { console.warn('"captureZone" is not set'); return; } this.captureZone.onmousedown = (e) => this.startCapture(e); this.captureZone.onmousemove = (e) => this.drawRect(e); this.captureZone.onmouseup = () => this.endCapture(); }, 2000); } startCapture(e) { const mouse = this.setMousePosition(e, true); this.isDrawing = true; this.cropDimensions = { x: mouse.x, y: mouse.y, width: 0, height: 0, }; this.captureZone.style.cursor = 'crosshair'; } drawRect(e) { if (this.isDrawing) { const mouse = this.setMousePosition(e, false); this.cropDimensions = { x: mouse.x - this.mouseStart.x < 0 ? mouse.x : this.mouseStart.x, y: mouse.y - this.mouseStart.y < 0 ? mouse.y : this.mouseStart.y, width: Math.abs(mouse.x - this.mouseStart.x), height: Math.abs(mouse.y - this.mouseStart.y), }; this.setRectangle(); } } setMousePosition(e, isStart = false) { const ev = e || window.event; // Moz || IE const mouse = { x: 0, y: 0 }; if (ev.pageX) { // Moz mouse.x = ev.clientX; mouse.y = ev.clientY; } else if (ev.clientX) { // IE mouse.x = ev.clientX + document.body.scrollLeft; mouse.y = ev.clientY + document.body.scrollTop; } if (isStart) { this.mouseStart.x = mouse.x; this.mouseStart.y = mouse.y; } return mouse; } endCapture() { this.captureZone.style.cursor = 'default'; this.isDrawing = false; this.captureService .getImage(this.target, false, { ...this.cropDimensions, x: this.cropDimensions.x + window.scrollX, y: this.cropDimensions.y + window.scrollY, }) .pipe(take(1), tap((img) => { this.resultImage.emit(img); })) .subscribe(); this.cropDimensions = { x: 0, y: 0, width: 0, height: 0, }; this.setRectangle(); } setRectangle() { this.rect.style.left = this.cropDimensions.x + 'px'; this.rect.style.top = this.cropDimensions.y + 'px'; this.rect.style.width = this.cropDimensions.width + 'px'; this.rect.style.height = this.cropDimensions.height + 'px'; } } NgxCaptureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgxCaptureComponent, deps: [{ token: i1.NgxCaptureService }], target: i0.ɵɵFactoryTarget.Component }); NgxCaptureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgxCaptureComponent, selector: "ngx-capture", inputs: { target: "target" }, outputs: { resultImage: "resultImage" }, viewQueries: [{ propertyName: "rectangle", first: true, predicate: ["rect"], descendants: true, static: true }, { propertyName: "overlay", first: true, predicate: ["over"], descendants: true, static: true }], ngImport: i0, template: ` <ng-content></ng-content> <div class="overlay" #over> <div class="rectangle" #rect></div> </div> `, isInline: true, styles: [".overlay{top:0;left:0;position:fixed;width:100vw;height:100vh}.rectangle{border:1px solid #ff0000;position:absolute}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgxCaptureComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-capture', template: ` <ng-content></ng-content> <div class="overlay" #over> <div class="rectangle" #rect></div> </div> `, styles: [".overlay{top:0;left:0;position:fixed;width:100vw;height:100vh}.rectangle{border:1px solid #ff0000;position:absolute}\n"] }] }], ctorParameters: function () { return [{ type: i1.NgxCaptureService }]; }, propDecorators: { rectangle: [{ type: ViewChild, args: ['rect', { static: true }] }], overlay: [{ type: ViewChild, args: ['over', { static: true }] }], target: [{ type: Input }], resultImage: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNhcHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNhcHR1cmUvc3JjL2xpYi9uZ3gtY2FwdHVyZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFrQjNDLE1BQU0sT0FBTyxtQkFBbUI7SUF1QjlCLFlBQW9CLGNBQWlDO1FBQWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQWxCM0MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBS25ELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsZUFBVSxHQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFbkMsbUJBQWMsR0FBbUI7WUFDL0IsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztZQUNKLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFDO1FBRUYsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFeUIsQ0FBQztJQUV6RCxRQUFRO1FBQ04sVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsT0FBTyxDQUFDLElB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LENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUM3RCxDQUFDOztnSEE1SFUsbUJBQW1CO29HQUFuQixtQkFBbUIsMlVBUnBCOzs7OztHQUtUOzJGQUdVLG1CQUFtQjtrQkFWL0IsU0FBUzsrQkFDRSxhQUFhLFlBQ2I7Ozs7O0dBS1Q7d0dBSW9DLFNBQVM7c0JBQTdDLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDRSxPQUFPO3NCQUEzQyxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTFCLE1BQU07c0JBQWQsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDcm9wRGltZW5zaW9ucywgTmd4Q2FwdHVyZVNlcnZpY2UgfSBmcm9tICcuL25neC1jYXB0dXJlLnNlcnZpY2UnO1xyXG5cclxudHlwZSBQb2ludCA9IHtcclxuICB4OiBudW1iZXI7XHJcbiAgeTogbnVtYmVyO1xyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtY2FwdHVyZScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCIgI292ZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyZWN0YW5nbGVcIiAjcmVjdD48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWNhcHR1cmUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neENhcHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ3JlY3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSByZWN0YW5nbGU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnb3ZlcicsIHsgc3RhdGljOiB0cnVlIH0pIG92ZXJsYXk6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIHRhcmdldDogYW55O1xyXG4gIEBPdXRwdXQoKSByZXN1bHRJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICByZWN0OiBIVE1MRWxlbWVudDtcclxuICBjYXB0dXJlWm9uZTogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIGlzRHJhd2luZyA9IGZhbHNlO1xyXG5cclxuICBtb3VzZVN0YXJ0OiBQb2ludCA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICBjcm9wRGltZW5zaW9uczogQ3JvcERpbWVuc2lvbnMgPSB7XHJcbiAgICB4OiAwLFxyXG4gICAgeTogMCxcclxuICAgIHdpZHRoOiAwLFxyXG4gICAgaGVpZ2h0OiAwLFxyXG4gIH07XHJcblxyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYXB0dXJlU2VydmljZTogTmd4Q2FwdHVyZVNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVjdCA9IHRoaXMucmVjdGFuZ2xlLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuY2FwdHVyZVpvbmUgPSB0aGlzLm92ZXJsYXkubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5jYXB0dXJlWm9uZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignXCJjYXB0dXJlWm9uZVwiIGlzIG5vdCBzZXQnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FwdHVyZVpvbmUub25tb3VzZWRvd24gPSAoZSkgPT4gdGhpcy5zdGFydENhcHR1cmUoZSk7XHJcbiAgICAgIHRoaXMuY2FwdHVyZVpvbmUub25tb3VzZW1vdmUgPSAoZSkgPT4gdGhpcy5kcmF3UmVjdChlKTtcclxuICAgICAgdGhpcy5jYXB0dXJlWm9uZS5vbm1vdXNldXAgPSAoKSA9PiB0aGlzLmVuZENhcHR1cmUoKTtcclxuICAgIH0sIDIwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydENhcHR1cmUoZTogYW55KSB7XHJcbiAgICBjb25zdCBtb3VzZSA9IHRoaXMuc2V0TW91c2VQb3NpdGlvbihlLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLmlzRHJhd2luZyA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jcm9wRGltZW5zaW9ucyA9IHtcclxuICAgICAgeDogbW91c2UueCxcclxuICAgICAgeTogbW91c2UueSxcclxuICAgICAgd2lkdGg6IDAsXHJcbiAgICAgIGhlaWdodDogMCxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jYXB0dXJlWm9uZS5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd1JlY3QoZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc0RyYXdpbmcpIHtcclxuICAgICAgY29uc3QgbW91c2UgPSB0aGlzLnNldE1vdXNlUG9zaXRpb24oZSwgZmFsc2UpO1xyXG5cclxuICAgICAgdGhpcy5jcm9wRGltZW5zaW9ucyA9IHtcclxuICAgICAgICB4OiBtb3VzZS54IC0gdGhpcy5tb3VzZVN0YXJ0LnggPCAwID8gbW91c2UueCA6IHRoaXMubW91c2VTdGFydC54LFxyXG4gICAgICAgIHk6IG1vdXNlLnkgLSB0aGlzLm1vdXNlU3RhcnQueSA8IDAgPyBtb3VzZS55IDogdGhpcy5tb3VzZVN0YXJ0LnksXHJcbiAgICAgICAgd2lkdGg6IE1hdGguYWJzKG1vdXNlLnggLSB0aGlzLm1vdXNlU3RhcnQueCksXHJcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhtb3VzZS55IC0gdGhpcy5tb3VzZVN0YXJ0LnkpLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnNldFJlY3RhbmdsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRNb3VzZVBvc2l0aW9uKGU6IGFueSwgaXNTdGFydCA9IGZhbHNlKTogUG9pbnQge1xyXG4gICAgY29uc3QgZXYgPSBlIHx8IHdpbmRvdy5ldmVudDsgLy8gTW96IHx8IElFXHJcbiAgICBjb25zdCBtb3VzZTogUG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcclxuXHJcbiAgICBpZiAoZXYucGFnZVgpIHtcclxuICAgICAgLy8gTW96XHJcbiAgICAgIG1vdXNlLnggPSBldi5jbGllbnRYO1xyXG4gICAgICBtb3VzZS55ID0gZXYuY2xpZW50WTtcclxuICAgIH0gZWxzZSBpZiAoZXYuY2xpZW50WCkge1xyXG4gICAgICAvLyBJRVxyXG4gICAgICBtb3VzZS54ID0gZXYuY2xpZW50WCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuICAgICAgbW91c2UueSA9IGV2LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNTdGFydCkge1xyXG4gICAgICB0aGlzLm1vdXNlU3RhcnQueCA9IG1vdXNlLng7XHJcbiAgICAgIHRoaXMubW91c2VTdGFydC55ID0gbW91c2UueTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbW91c2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuZENhcHR1cmUoKSB7XHJcbiAgICB0aGlzLmNhcHR1cmVab25lLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgIHRoaXMuaXNEcmF3aW5nID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5jYXB0dXJlU2VydmljZVxyXG4gICAgICAuZ2V0SW1hZ2UodGhpcy50YXJnZXQsIGZhbHNlLCB7XHJcbiAgICAgICAgLi4udGhpcy5jcm9wRGltZW5zaW9ucyxcclxuICAgICAgICB4OiB0aGlzLmNyb3BEaW1lbnNpb25zLnggKyB3aW5kb3cuc2Nyb2xsWCxcclxuICAgICAgICB5OiB0aGlzLmNyb3BEaW1lbnNpb25zLnkgKyB3aW5kb3cuc2Nyb2xsWSxcclxuICAgICAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICB0YXAoKGltZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXN1bHRJbWFnZS5lbWl0KGltZyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5jcm9wRGltZW5zaW9ucyA9IHtcclxuICAgICAgeDogMCxcclxuICAgICAgeTogMCxcclxuICAgICAgd2lkdGg6IDAsXHJcbiAgICAgIGhlaWdodDogMCxcclxuICAgIH07XHJcbiAgICB0aGlzLnNldFJlY3RhbmdsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRSZWN0YW5nbGUoKSB7XHJcbiAgICB0aGlzLnJlY3Quc3R5bGUubGVmdCA9IHRoaXMuY3JvcERpbWVuc2lvbnMueCArICdweCc7XHJcbiAgICB0aGlzLnJlY3Quc3R5bGUudG9wID0gdGhpcy5jcm9wRGltZW5zaW9ucy55ICsgJ3B4JztcclxuICAgIHRoaXMucmVjdC5zdHlsZS53aWR0aCA9IHRoaXMuY3JvcERpbWVuc2lvbnMud2lkdGggKyAncHgnO1xyXG4gICAgdGhpcy5yZWN0LnN0eWxlLmhlaWdodCA9IHRoaXMuY3JvcERpbWVuc2lvbnMuaGVpZ2h0ICsgJ3B4JztcclxuICB9XHJcbn1cclxuIl19