ng-magnizoom
Version:
Angular image magnifier (based on HTML canvas)
1 lines • 23.3 kB
Source Map (JSON)
{"version":3,"file":"ng-magnizoom.mjs","sources":["../../../projects/ng-magnizoom/src/lib/magnizoom.service.ts","../../../projects/ng-magnizoom/src/lib/magnizoom.component.ts","../../../projects/ng-magnizoom/src/lib/magnizoom.component.html","../../../projects/ng-magnizoom/src/lib/magnizoom.module.ts","../../../projects/ng-magnizoom/src/public-api.ts","../../../projects/ng-magnizoom/src/ng-magnizoom.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MagnizoomService {\n\n constructor() { }\n}\n","import type { ElementRef } from '@angular/core';\nimport { Component, OnInit, OnChanges, SimpleChanges, Input, Output, ViewChild, EventEmitter } from '@angular/core';\n\ninterface Size2D { width: number; height: number; }\ntype Point2D = { x: number, y: number } | null;\n\n@Component({\n selector: 'ng-magnizoom',\n templateUrl: './magnizoom.component.html',\n styleUrls: ['./magnizoom.component.scss']\n})\nexport class NgMagnizoomComponent implements OnInit, OnChanges {\n\n @Input() imageSrc: string;\n @Input() zoomMode: 'LENS' | 'COVER' = 'COVER';\n @Input() minZoomFactor = 1.2;\n @Input() maxZoomFactor = 3;\n\n @Input() zoomFactor = 2;\n @Output() zoomFactorChange = new EventEmitter<number>();\n\n @Input() lensSizeUnit: 'NORMALIZED' | 'PIXEL' = 'NORMALIZED';\n @Input() lensSize: Size2D = { width: 0.5, height: 0.5 };\n\n @Input() zoomCenterUnit: 'NORMALIZED' | 'PIXEL' = 'NORMALIZED';\n @Input() zoomCenter?: Point2D;\n @Output() zoomCenterChange = new EventEmitter<Point2D | undefined>();\n\n\n @Input() updateOnMouseEvents = true;\n\n\n @Input() imageStyle: { [x: string]: any; };\n @Input() imageClass: any;\n\n @ViewChild('mainCanvas', { static: true }) mainCanvasRef: ElementRef;\n\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n image: HTMLImageElement;\n\n _centerPosition: Point2D;\n _lensSize?: Size2D;\n _zoomFactor: number;\n\n imageReady = false;\n get canvasWidth() { return this.image && this.image.width || 800; }\n get canvasHeight() { return this.image && this.image.height || 600; }\n\n constructor() { }\n\n ngOnInit() {\n this.initContext();\n this.loadImage(this.imageSrc);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!changes) {\n return;\n }\n if (changes.lensSize || changes.zoomCenter || changes.zoomFactor) {\n this.updateParameters();\n }\n if (changes.imageSrc && !changes.imageSrc.firstChange) {\n this.loadImage(changes.imageSrc.currentValue);\n }\n }\n\n initContext() {\n this.canvas = (this.mainCanvasRef.nativeElement as HTMLCanvasElement);\n this.context = this.canvas.getContext('2d');\n }\n\n loadImage(src: string) {\n this.image = new Image();\n this.image.onload = () => {\n this.imageReady = true;\n this.updateParameters();\n setTimeout(() => this.update());\n };\n this.image.src = src;\n }\n\n updateParameters() {\n if (this.lensSizeUnit === 'NORMALIZED') {\n if (this.imageReady) {\n this._lensSize = {\n width: this.lensSize.width * this.image.width,\n height: this.lensSize.height * this.image.height\n };\n }\n } else {\n this._lensSize = {\n width: this.lensSize.width,\n height: this.lensSize.height\n };\n }\n\n if (!this.zoomCenter) {\n this._centerPosition = undefined;\n } else if (this.zoomCenterUnit === 'NORMALIZED'){\n if (this.imageReady) {\n this._centerPosition = {\n x: this.zoomCenter.x * this.image.width,\n y: this.zoomCenter.y * this.image.height\n };\n }\n } else {\n this._centerPosition = {\n x: this.zoomCenter.x,\n y: this.zoomCenter.y\n };\n }\n\n this._zoomFactor = this.zoomFactor;\n if (this._zoomFactor > this.maxZoomFactor) {\n this._zoomFactor = this.maxZoomFactor;\n }\n if (this._zoomFactor < this.minZoomFactor) {\n this._zoomFactor = this.minZoomFactor;\n }\n\n this.update();\n }\n\n update() {\n this.render();\n let currUnitCenter: { x: number, y: number } | undefined, needUpdate = false;\n if (!this._centerPosition) {\n currUnitCenter = undefined;\n needUpdate = currUnitCenter !== this.zoomCenter;\n } else if (this.zoomCenterUnit === 'NORMALIZED') {\n if (this.imageReady) {\n currUnitCenter = {\n x: this._centerPosition.x / this.image.width,\n y: this._centerPosition.y / this.image.height\n };\n needUpdate = currUnitCenter.x !== this.zoomCenter?.x || currUnitCenter.y !== this.zoomCenter?.y;\n }\n } else {\n currUnitCenter = {\n x: this._centerPosition.x,\n y: this._centerPosition.y\n };\n needUpdate = currUnitCenter.x !== this.zoomCenter?.x || currUnitCenter.y !== this.zoomCenter?.y;\n }\n if (needUpdate) {\n this.zoomCenterChange.emit(currUnitCenter);\n }\n }\n\n render() {\n if (!this.context || !this.imageReady) {\n return;\n }\n\n this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight); // clear canvas\n this.context.lineWidth = 1; // border width\n this.context.drawImage(this.image, 0, 0); // bg image\n\n if (this._centerPosition) {\n switch (this.zoomMode) {\n case 'LENS': this.renderLensMode(); break;\n case 'COVER': this.renderCoverMode(); break;\n }\n }\n }\n\n renderLensMode() {\n this.context.lineWidth = 5; // border width\n const zoomRect = this.getZoomRect();\n this.context.fillRect(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h); // bg (clear)\n const clippingRect = this.getClippingRect();\n // zoom image\n this.context.drawImage(\n this.image,\n clippingRect.x, clippingRect.y, clippingRect.w, clippingRect.h,\n zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h\n );\n this.context.strokeRect(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h); // border\n }\n\n renderCoverMode() {\n const covertRect = this.getCoverRect();\n this.context.drawImage(\n this.image,\n covertRect.x, covertRect.y, covertRect.w, covertRect.h,\n 0, 0, this.canvasWidth, this.canvasHeight\n ); // cover image\n }\n\n getZoomRect() {\n const w = this._lensSize.width;\n const h = this._lensSize.height;\n const x = this._centerPosition.x - (w / 2);\n const y = this._centerPosition.y - (h / 2);\n return this.clampRect(x, y, w, h);\n }\n\n getClippingRect() {\n const w = this._lensSize.width / this._zoomFactor;\n const h = this._lensSize.height / this._zoomFactor;\n const x = this._centerPosition.x - (w / 2);\n const y = this._centerPosition.y - (h / 2);\n return this.clampRect(x, y, w, h);\n }\n\n getCoverRect() {\n const w = this.canvasWidth / this._zoomFactor;\n const h = this.canvasHeight / this._zoomFactor;\n // const x = this.mousePosition.x - (w / 2);\n // const y = this.mousePosition.y - (h / 2);\n const x = this._centerPosition.x - this._centerPosition.x / this._zoomFactor;\n const y = this._centerPosition.y - this._centerPosition.y / this._zoomFactor;\n return this.clampRect(x, y, w, h);\n }\n\n clampRect(x: number, y: number, w: number, h: number) {\n if (x <= 0) { x = 0; }\n if (x + w >= this.canvasWidth) { x = this.canvasWidth - w; }\n if (y < 0) { y = 0; }\n if (y + h >= this.canvasHeight) { y = this.canvasHeight - h; }\n return { x, y, w, h };\n }\n\n calculateMousePosition(clientX: number, clientY: number) {\n const boundingRect = this.canvas.getBoundingClientRect();\n\n const boundingRectX = (clientX - boundingRect.left);\n const boundingRectY = (clientY - boundingRect.top);\n\n let elementX = boundingRectX, elementY = boundingRectY;\n let elementWidth = boundingRect.width, elementHeight = boundingRect.height;\n\n const computedStyle = window.getComputedStyle(this.canvas, null);\n const domMatrix = new DOMMatrix(computedStyle.transform);\n if (!domMatrix.isIdentity) {\n const { a, b } = domMatrix;\n const transformRot = Math.atan2(b, a);\n const transformScale = Math.round( Math.sqrt(a * a + b * b) * 100 ) / 100;\n if (transformRot) {\n const boundingRectCenterX = boundingRect.width / 2;\n const boundingRectCenterY = boundingRect.height / 2;\n const dx = (boundingRectX - boundingRectCenterX);\n const dy = (boundingRectY - boundingRectCenterY);\n const d = Math.sqrt(dx * dx + dy * dy);\n const r = Math.atan2(dy, dx);\n elementWidth = this.canvas.clientWidth * transformScale;\n elementHeight = this.canvas.clientHeight * transformScale;\n elementX = (elementWidth / 2) + (d * Math.cos(r - transformRot));\n elementY = (elementHeight / 2) + (d * Math.sin(r - transformRot));\n }\n }\n\n const viewToModelX = this.canvasWidth / elementWidth;\n const viewToModelY = this.canvasHeight / elementHeight;\n const x = elementX * viewToModelX;\n const y = elementY * viewToModelY;\n this._centerPosition = { x, y };\n }\n\n onMouseLeave(event: MouseEvent) {\n if (!this.updateOnMouseEvents) { return; }\n this._centerPosition = null;\n this.update();\n }\n\n onMouseEnterOrMove(event: MouseEvent) {\n if (!this.updateOnMouseEvents) { return; }\n this.calculateMousePosition(event.clientX, event.clientY);\n this.update();\n }\n\n onMouseScroll(event: WheelEvent) {\n if (!this.updateOnMouseEvents) { return; }\n let newZoomFactor = this._zoomFactor;\n newZoomFactor -= event.deltaY / 1000;\n if (newZoomFactor < this.minZoomFactor) { newZoomFactor = this.minZoomFactor; }\n if (newZoomFactor > this.maxZoomFactor) { newZoomFactor = this.maxZoomFactor; }\n if (this._zoomFactor !== newZoomFactor) {\n this._zoomFactor = newZoomFactor;\n if (this.zoomFactor !== this._zoomFactor) {\n this.zoomFactorChange.emit(this._zoomFactor);\n }\n this.update();\n }\n event.preventDefault();\n event.stopPropagation();\n }\n\n\n}\n","<canvas #mainCanvas\n class=\"main-canvas\"\n [ngClass]=\"imageClass\"\n [ngStyle]=\"imageStyle\"\n [width]=\"canvasWidth\"\n [height]=\"canvasHeight\"\n (mouseleave)=\"onMouseLeave($event)\"\n (mouseenter)=\"onMouseEnterOrMove($event)\"\n (mousemove)=\"onMouseEnterOrMove($event)\"\n (wheel)=\"onMouseScroll($event)\">\n</canvas>\n","import { NgModule } from '@angular/core';\nimport { NgMagnizoomComponent } from './magnizoom.component';\nimport { CommonModule } from '@angular/common';\n\n\n\n@NgModule({\n declarations: [NgMagnizoomComponent],\n imports: [\n CommonModule\n ],\n exports: [NgMagnizoomComponent]\n})\nexport class NgMagnizoomModule { }\n","/*\n * Public API Surface of ng-magnizoom\n */\n\nexport * from './lib/magnizoom.service';\nexport * from './lib/magnizoom.component';\nexport * from './lib/magnizoom.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}