ngx-capture
Version:
Screen capture library for Angular
129 lines • 16.5 kB
JavaScript
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